112027Sjungma@eit.uni-kl.de/*
212027Sjungma@eit.uni-kl.de   + * QuickThreads -- Threads-building toolkit.
312027Sjungma@eit.uni-kl.de   + * Copyright (c) 1993 by David Keppel
412027Sjungma@eit.uni-kl.de   + *
512027Sjungma@eit.uni-kl.de   + * Permission to use, copy, modify and distribute this software and
612027Sjungma@eit.uni-kl.de   + * its documentation for any purpose and without fee is hereby
712027Sjungma@eit.uni-kl.de   + * granted, provided that the above copyright notice and this notice
812027Sjungma@eit.uni-kl.de   + * appear in all copies.  This software is provided as a
912027Sjungma@eit.uni-kl.de   + * proof-of-concept and for demonstration purposes; there is no
1012027Sjungma@eit.uni-kl.de   + * representation about the suitability of this software for any
1112027Sjungma@eit.uni-kl.de   + * purpose.
1212027Sjungma@eit.uni-kl.de   + *
1312027Sjungma@eit.uni-kl.de
1412027Sjungma@eit.uni-kl.de   + * PowerPC-Sys5 thread switching module.
1512027Sjungma@eit.uni-kl.de   + *
1612027Sjungma@eit.uni-kl.de   + * This software is largely based on the original PowerPC-Linux porting
1712027Sjungma@eit.uni-kl.de   + * developed by Ken Aaker <kenaaker@silverbacksystems.com>
1812027Sjungma@eit.uni-kl.de   + *
1912027Sjungma@eit.uni-kl.de   + * Marco Bucci <marco.bucci@inwind.it>
2012027Sjungma@eit.uni-kl.de   + * December 2002
2112027Sjungma@eit.uni-kl.de   + *
2212027Sjungma@eit.uni-kl.de   + */
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de
2512027Sjungma@eit.uni-kl.de#ifndef QUICKTHREADS_POWERPC_H
2612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_POWERPC_H
2712027Sjungma@eit.uni-kl.de
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.de/*****************************************************************************
3012027Sjungma@eit.uni-kl.de *
3112027Sjungma@eit.uni-kl.de * DESCRIPTION
3212027Sjungma@eit.uni-kl.de *
3312027Sjungma@eit.uni-kl.de * This is the QuickThreads switching module implementation for PowerPC
3412027Sjungma@eit.uni-kl.de * running under System V ABI (Application Binary Interface) [2]. It was
3512027Sjungma@eit.uni-kl.de * developed by porting the MacOS X version and tested under LinuxPPC.
3612027Sjungma@eit.uni-kl.de *
3712027Sjungma@eit.uni-kl.de * Notice that this is not the same than the PowerPC Mach  ABI used by MacOSX
3812027Sjungma@eit.uni-kl.de * [1].
3912027Sjungma@eit.uni-kl.de *
4012027Sjungma@eit.uni-kl.de * IMPLEMENTATION NOTES
4112027Sjungma@eit.uni-kl.de *
4212027Sjungma@eit.uni-kl.de * 1) Porting on System V ABI
4312027Sjungma@eit.uni-kl.de * Excluding the variant argument calling convention, Mach and System V ABI
4412027Sjungma@eit.uni-kl.de * are enough similar and it could be possible to use some simple macro, to
4512027Sjungma@eit.uni-kl.de * adapt the code for both the ABIs. Actually, the only relevant difference
4612027Sjungma@eit.uni-kl.de * is in the linkage area structure and in the position where the Link and
4712027Sjungma@eit.uni-kl.de * the Condition registers are saved. As to the calling conventions, there
4812027Sjungma@eit.uni-kl.de * are differences with floating points argument passing and with variant
4912027Sjungma@eit.uni-kl.de * argument lists. Notice that, on Mach, the caller's stack frame allocates
5012027Sjungma@eit.uni-kl.de * space to hold all arguments ([1] p.51), while on System V, the caller's
5112027Sjungma@eit.uni-kl.de * stack frame allocates space to hold just the arguments that don't fit into
5212027Sjungma@eit.uni-kl.de * registers ([2] p.3.18).
5312027Sjungma@eit.uni-kl.de *
5412027Sjungma@eit.uni-kl.de * 2) Variant argument list implementation
5512027Sjungma@eit.uni-kl.de * Variant argument calling on a RISC machine is not easy to implement since
5612027Sjungma@eit.uni-kl.de * parameters are passed via registers instead of via stack. In a general
5712027Sjungma@eit.uni-kl.de * variant argument implementation, the caller's stack must map the whole
5812027Sjungma@eit.uni-kl.de * parameter list following the rules related to the use of the GPR and FPR
5912027Sjungma@eit.uni-kl.de * parameter registers and the stack alignment ([2] p.3-21).
6012027Sjungma@eit.uni-kl.de * This implementation is quite simple and not general. It works under the
6112027Sjungma@eit.uni-kl.de * hypothesis that arguments are 4-bytes aligned integers.
6212027Sjungma@eit.uni-kl.de *
6312027Sjungma@eit.uni-kl.de * 3) This heather file organisation
6412027Sjungma@eit.uni-kl.de * I preferred to not make confusion between macros that are needed (i.e.
6512027Sjungma@eit.uni-kl.de * directly used) by QuickThreads and internal "implementation" macros. You
6612027Sjungma@eit.uni-kl.de * will find QuickThreds macros in the end of this header. Sometime they just
6712027Sjungma@eit.uni-kl.de * refer to an analogous "internal" macro. On the top, there are the macros
6812027Sjungma@eit.uni-kl.de * that I used to make more clean (I hope) the implementation. I could include
6912027Sjungma@eit.uni-kl.de * some system heather (as to stack layout definitions, prologs and epilogs,
7012027Sjungma@eit.uni-kl.de * etc.), but I preferred to have a self-contained heather in order to make
7112027Sjungma@eit.uni-kl.de * all more clear for mantaining and for possible porting on another ABI.
7212027Sjungma@eit.uni-kl.de *
7312027Sjungma@eit.uni-kl.de *
7412027Sjungma@eit.uni-kl.de * REFERENCES
7512027Sjungma@eit.uni-kl.de *
7612027Sjungma@eit.uni-kl.de * [1] - Mach-O Runtime Architecture
7712027Sjungma@eit.uni-kl.de *       Runtime Concepts and Conventions for Mac OS X Programs
7812027Sjungma@eit.uni-kl.de *       Preliminary July 2002
7912027Sjungma@eit.uni-kl.de *
8012027Sjungma@eit.uni-kl.de * [2] - SYSTEM V APPLICATION BINARY INTERFACE
8112027Sjungma@eit.uni-kl.de *       PowerPC Processor Supplement
8212027Sjungma@eit.uni-kl.de *       September 1995
8312027Sjungma@eit.uni-kl.de *
8412027Sjungma@eit.uni-kl.de
8512027Sjungma@eit.uni-kl.de *****************************************************************************/
8612027Sjungma@eit.uni-kl.de
8712027Sjungma@eit.uni-kl.de/*****************************************************************************
8812027Sjungma@eit.uni-kl.de *
8912027Sjungma@eit.uni-kl.de *  PowerPC System V Stack frame (see [2])
9012027Sjungma@eit.uni-kl.de *
9112027Sjungma@eit.uni-kl.de
9212027Sjungma@eit.uni-kl.de                      ................
9312027Sjungma@eit.uni-kl.de                +                          +
9412027Sjungma@eit.uni-kl.de                |                          |
9512027Sjungma@eit.uni-kl.de                +--------------------------+
9612027Sjungma@eit.uni-kl.de                |                          | Caller's LR
9712027Sjungma@eit.uni-kl.de                +  CALLER'S LINKAGE AREA   +
9812027Sjungma@eit.uni-kl.de backchain ->   |                          | Caller's backchain
9912027Sjungma@eit.uni-kl.de                +==========================+
10012027Sjungma@eit.uni-kl.de                |                          | FPR31
10112027Sjungma@eit.uni-kl.de                +      FPR SAVE AREA       +
10212027Sjungma@eit.uni-kl.de                       ..............
10312027Sjungma@eit.uni-kl.de                +                          +
10412027Sjungma@eit.uni-kl.de                |                          | FPRn
10512027Sjungma@eit.uni-kl.de                +--------------------------+
10612027Sjungma@eit.uni-kl.de                |                          | GPR31
10712027Sjungma@eit.uni-kl.de                +      GPR SAVE AREA       +
10812027Sjungma@eit.uni-kl.de                       ..............
10912027Sjungma@eit.uni-kl.de                +                          +
11012027Sjungma@eit.uni-kl.de                |                          | GPRn
11112027Sjungma@eit.uni-kl.de                +--------------------------+
11212027Sjungma@eit.uni-kl.de                |                          |
11312027Sjungma@eit.uni-kl.de                +      ALIGNMEBNT PAD      +
11412027Sjungma@eit.uni-kl.de                       ..............
11512027Sjungma@eit.uni-kl.de                +       (if needed)        +
11612027Sjungma@eit.uni-kl.de                |                          |
11712027Sjungma@eit.uni-kl.de                +--------------------------+
11812027Sjungma@eit.uni-kl.de                |         CR SAVE          |
11912027Sjungma@eit.uni-kl.de                +--------------------------+
12012027Sjungma@eit.uni-kl.de                |                          |
12112027Sjungma@eit.uni-kl.de                +   LOCAL VARIABLES AREA   +
12212027Sjungma@eit.uni-kl.de                       ..............
12312027Sjungma@eit.uni-kl.de                +                          +
12412027Sjungma@eit.uni-kl.de                |                          |
12512027Sjungma@eit.uni-kl.de                +--------------------------+
12612027Sjungma@eit.uni-kl.de                |                          | PAR(n-7)
12712027Sjungma@eit.uni-kl.de                +                          +
12812027Sjungma@eit.uni-kl.de                |                          |
12912027Sjungma@eit.uni-kl.de                +      PARAMETER AREA      +
13012027Sjungma@eit.uni-kl.de                       ..............
13112027Sjungma@eit.uni-kl.de                +      for FUTURE call     +
13212027Sjungma@eit.uni-kl.de                |                          | PAR(9)
13312027Sjungma@eit.uni-kl.de                +                          +
13412027Sjungma@eit.uni-kl.de SP + 8 ->      |                          | PAR(8)
13512027Sjungma@eit.uni-kl.de                +--------------------------+
13612027Sjungma@eit.uni-kl.de SP + 4 ->      |                          | LR callee-save for FUTURE call
13712027Sjungma@eit.uni-kl.de                +       LINKAGE AREA       +
13812027Sjungma@eit.uni-kl.de SP ->          |                          | backchain
13912027Sjungma@eit.uni-kl.de                +==========================+
14012027Sjungma@eit.uni-kl.de                STACK TOP (lower address)
14112027Sjungma@eit.uni-kl.de
14212027Sjungma@eit.uni-kl.de                     Stack grows down
14312027Sjungma@eit.uni-kl.de                             |
14412027Sjungma@eit.uni-kl.de                             V
14512027Sjungma@eit.uni-kl.de
14612027Sjungma@eit.uni-kl.de
14712027Sjungma@eit.uni-kl.de * NOTE:
14812027Sjungma@eit.uni-kl.de *
14912027Sjungma@eit.uni-kl.de * 1) In this figure parameter are supposed to be integer 4-bytes aligned and
15012027Sjungma@eit.uni-kl.de * are numbered 0, 1, 2,... n.
15112027Sjungma@eit.uni-kl.de *
15212027Sjungma@eit.uni-kl.de * 2) Parameter are allocated in the CALLER's parameter area. This area must
15312027Sjungma@eit.uni-kl.de * be large enough to hold all parameters that cannot fit in registers (no
15412027Sjungma@eit.uni-kl.de * more parameter registers are available);
15512027Sjungma@eit.uni-kl.de *
15612027Sjungma@eit.uni-kl.de * 3) The callee saves LR in the caller's linkage area. CR as all other
15712027Sjungma@eit.uni-kl.de * callee's state are saved in its own stack frame.
15812027Sjungma@eit.uni-kl.de *
15912027Sjungma@eit.uni-kl.de
16012027Sjungma@eit.uni-kl.de *****************************************************************************/
16112027Sjungma@eit.uni-kl.de
16212027Sjungma@eit.uni-kl.de
16312027Sjungma@eit.uni-kl.de/*****************************************************************************
16412027Sjungma@eit.uni-kl.de *
16512027Sjungma@eit.uni-kl.de * Stack initialization for a single argument thread
16612027Sjungma@eit.uni-kl.de *
16712027Sjungma@eit.uni-kl.de
16812027Sjungma@eit.uni-kl.de
16912027Sjungma@eit.uni-kl.de top + QUICKTHREADS_STKBASE ->           STACK BOTTOM (higher address)
17012027Sjungma@eit.uni-kl.de                               +==========================+
17112027Sjungma@eit.uni-kl.de                               |                          |
17212027Sjungma@eit.uni-kl.de                               +                          +
17312027Sjungma@eit.uni-kl.de                                     ..............
17412027Sjungma@eit.uni-kl.de                               +                          +
17512027Sjungma@eit.uni-kl.de                               |                          |
17612027Sjungma@eit.uni-kl.de                               +--------------------------+
17712027Sjungma@eit.uni-kl.de top + QUICKTHREADS_ONLY_INDEX * 4 ->    | only param               | PAR(3)
17812027Sjungma@eit.uni-kl.de                               +                          +
17912027Sjungma@eit.uni-kl.de top + QUICKTHREADS_USER_INDEX * 4 ->    | userf param              | PAR(2)
18012027Sjungma@eit.uni-kl.de                               +                          +
18112027Sjungma@eit.uni-kl.de top + QUICKTHREADS_ARGT_INDEX * 4 ->    | t param                  | PAR(1)
18212027Sjungma@eit.uni-kl.de                               +                          +
18312027Sjungma@eit.uni-kl.de top + QUICKTHREADS_ARGU_INDEX * 4 ->    | u param                  | PAR(0)
18412027Sjungma@eit.uni-kl.de                               +--------------------------+
18512027Sjungma@eit.uni-kl.de top + QUICKTHREADS_RETURN_INDEX * 4 ->  | qt_start                 | LR save
18612027Sjungma@eit.uni-kl.de                               +                          +
18712027Sjungma@eit.uni-kl.de top + QUICKTHREADS_BLOCKI_FRAME_SIZE -> | top + QUICKTHREADS_STKBASE         | backchain
18812027Sjungma@eit.uni-kl.de                               +==========================+
18912027Sjungma@eit.uni-kl.de                               |                          |
19012027Sjungma@eit.uni-kl.de                               +                          +
19112027Sjungma@eit.uni-kl.de                                     ..............
19212027Sjungma@eit.uni-kl.de                               +                          +
19312027Sjungma@eit.uni-kl.de                               |                          |
19412027Sjungma@eit.uni-kl.de                               +--------------------------+
19512027Sjungma@eit.uni-kl.de                               |                          |
19612027Sjungma@eit.uni-kl.de                               +                          +
19712027Sjungma@eit.uni-kl.de top ->                        |top + QUICKTHREADS_BLOCKI_FRAME_SIZE| backchain
19812027Sjungma@eit.uni-kl.de                               +==========================+
19912027Sjungma@eit.uni-kl.de                               STACK TOP (lower address)
20012027Sjungma@eit.uni-kl.de
20112027Sjungma@eit.uni-kl.de                                    Stack grows down
20212027Sjungma@eit.uni-kl.de                                           |
20312027Sjungma@eit.uni-kl.de                                           V
20412027Sjungma@eit.uni-kl.de
20512027Sjungma@eit.uni-kl.de *****************************************************************************
20612027Sjungma@eit.uni-kl.de *
20712027Sjungma@eit.uni-kl.de * Stack initialization for a variant argument thread
20812027Sjungma@eit.uni-kl.de *
20912027Sjungma@eit.uni-kl.de
21012027Sjungma@eit.uni-kl.de bottom ->                     STACK BOTTOM (higher address)
21112027Sjungma@eit.uni-kl.de                               +==========================+
21212027Sjungma@eit.uni-kl.de                               |                          |
21312027Sjungma@eit.uni-kl.de                               +                          +
21412027Sjungma@eit.uni-kl.de                                     ..............
21512027Sjungma@eit.uni-kl.de                               +                          +
21612027Sjungma@eit.uni-kl.de top + QUICKTHREADS_VSTKBASE ->          | arg(0)                   | PAR(4)
21712027Sjungma@eit.uni-kl.de                               +--------------------------+
21812027Sjungma@eit.uni-kl.de top + QUICKTHREADS_CLEANUP_INDEX * 4 -> | cleanup param            | PAR(3)
21912027Sjungma@eit.uni-kl.de                               +                          +
22012027Sjungma@eit.uni-kl.de top + QUICKTHREADS_USER_INDEX * 4 ->    | userf param              | PAR(2)
22112027Sjungma@eit.uni-kl.de                               +                          +
22212027Sjungma@eit.uni-kl.de top + QUICKTHREADS_VSTARTUP_INDEX * 4 ->| startup param            | PAR(1)
22312027Sjungma@eit.uni-kl.de                               +                          +
22412027Sjungma@eit.uni-kl.de top + QUICKTHREADS_ARGT_INDEX * 4 ->    | t param                  | PAR(0)
22512027Sjungma@eit.uni-kl.de                               +--------------------------+
22612027Sjungma@eit.uni-kl.de top + QUICKTHREADS_RETURN_INDEX * 4 ->  | qt_start                 | LR save
22712027Sjungma@eit.uni-kl.de                               +                          +
22812027Sjungma@eit.uni-kl.de top + QUICKTHREADS_BLOCKI_FRAME_SIZE -> | top + QUICKTHREADS_STKBASE         | backchain
22912027Sjungma@eit.uni-kl.de                               +==========================+
23012027Sjungma@eit.uni-kl.de                               |                          |
23112027Sjungma@eit.uni-kl.de                               +                          +
23212027Sjungma@eit.uni-kl.de                                     ..............
23312027Sjungma@eit.uni-kl.de                               +                          +
23412027Sjungma@eit.uni-kl.de                               |                          |
23512027Sjungma@eit.uni-kl.de                               +--------------------------+
23612027Sjungma@eit.uni-kl.de                               |                          |
23712027Sjungma@eit.uni-kl.de                               +                          +
23812027Sjungma@eit.uni-kl.de top ->                        |top + QUICKTHREADS_BLOCKI_FRAME_SIZE| backchain
23912027Sjungma@eit.uni-kl.de                               +==========================+
24012027Sjungma@eit.uni-kl.de                               STACK TOP (lower address)
24112027Sjungma@eit.uni-kl.de
24212027Sjungma@eit.uni-kl.de                                    Stack grows down
24312027Sjungma@eit.uni-kl.de                                          |
24412027Sjungma@eit.uni-kl.de                                          V
24512027Sjungma@eit.uni-kl.de
24612027Sjungma@eit.uni-kl.de* NOTE:
24712027Sjungma@eit.uni-kl.de*
24812027Sjungma@eit.uni-kl.de* Parameters are passed to "qt_start" or to "qt_vstart" putting them into
24912027Sjungma@eit.uni-kl.de* the stack frames of "qt_start" or "qt_vstart" themselves. This not a
25012027Sjungma@eit.uni-kl.de* conventional parameter passing because parameters should be put into the
25112027Sjungma@eit.uni-kl.de* caller's stack, not into the callee's one. Actually  we must consider
25212027Sjungma@eit.uni-kl.de* that as a preload of the parameter area that "qt_start" or "qt_vstart"
25312027Sjungma@eit.uni-kl.de* will use for their own calls.
25412027Sjungma@eit.uni-kl.de*  Be aware of the fact that, during a call, the caller's parameter area is,
25512027Sjungma@eit.uni-kl.de* in a certain sense, volatile. In facts, the callee can save parameter
25612027Sjungma@eit.uni-kl.de* registers on the caller's parameter area.
25712027Sjungma@eit.uni-kl.de*
25812027Sjungma@eit.uni-kl.de *****************************************************************************/
25912027Sjungma@eit.uni-kl.de
26012027Sjungma@eit.uni-kl.de
26112027Sjungma@eit.uni-kl.de/*****************************************************************************
26212027Sjungma@eit.uni-kl.de
26312027Sjungma@eit.uni-kl.de   Define PowerPC System V related macros
26412027Sjungma@eit.uni-kl.de
26512027Sjungma@eit.uni-kl.de *****************************************************************************/
26612027Sjungma@eit.uni-kl.de
26712027Sjungma@eit.uni-kl.de
26812027Sjungma@eit.uni-kl.de
26912027Sjungma@eit.uni-kl.detypedef unsigned long PPC_W;
27012027Sjungma@eit.uni-kl.de
27112027Sjungma@eit.uni-kl.de/* Stack pointer must always be a multiple of 16 */
27212027Sjungma@eit.uni-kl.de#define	PPC_STACK_INCR	16
27312027Sjungma@eit.uni-kl.de#define	PPC_ROUND_STACK(length)	\
27412027Sjungma@eit.uni-kl.de	(((length)+PPC_STACK_INCR-1) & ~(PPC_STACK_INCR-1))
27512027Sjungma@eit.uni-kl.de
27612027Sjungma@eit.uni-kl.de
27712027Sjungma@eit.uni-kl.de#define PPC_LINKAGE_AREA 8
27812027Sjungma@eit.uni-kl.de#define PPC_LR_SAVE 4
27912027Sjungma@eit.uni-kl.de
28012027Sjungma@eit.uni-kl.de#define PPC_PARAM_AREA(n) (4*(n))
28112027Sjungma@eit.uni-kl.de
28212027Sjungma@eit.uni-kl.de#define PPC_GPR_SAVE_AREA (4*19)		/* GPR13-GPR31 must be saved */
28312027Sjungma@eit.uni-kl.de#define PPC_FPR_SAVE_AREA (8*18)		/* FPR14-FPR31 must be saved */
28412027Sjungma@eit.uni-kl.de
28512027Sjungma@eit.uni-kl.de/* Define parameter offset on the stack.
28612027Sjungma@eit.uni-kl.de * NOTICE: Parameters are numbered 0, 1, ..., n.
28712027Sjungma@eit.uni-kl.de*/
28812027Sjungma@eit.uni-kl.de#define PPC_PAR(i) (PPC_LINKAGE_AREA+(i)*4)
28912027Sjungma@eit.uni-kl.de
29012027Sjungma@eit.uni-kl.de/*****************************************************************************
29112027Sjungma@eit.uni-kl.de
29212027Sjungma@eit.uni-kl.de   Define stack frames
29312027Sjungma@eit.uni-kl.de
29412027Sjungma@eit.uni-kl.de *****************************************************************************/
29512027Sjungma@eit.uni-kl.de
29612027Sjungma@eit.uni-kl.de
29712027Sjungma@eit.uni-kl.de/* Define the "qt_blocki" and "qt_abort" stack frame. We use the same stack
29812027Sjungma@eit.uni-kl.de * frame for both.
29912027Sjungma@eit.uni-kl.de *
30012027Sjungma@eit.uni-kl.de
30112027Sjungma@eit.uni-kl.de top + S ->
30212027Sjungma@eit.uni-kl.de                        +==========================+
30312027Sjungma@eit.uni-kl.de top + S - 4 ->         |                          | GPR31
30412027Sjungma@eit.uni-kl.de                        +      GPR SAVE AREA       +
30512027Sjungma@eit.uni-kl.de                               ..............
30612027Sjungma@eit.uni-kl.de                        +                          +
30712027Sjungma@eit.uni-kl.de top + S - 19 * 4 ->    |                          | GPR13
30812027Sjungma@eit.uni-kl.de                        +--------------------------+
30912027Sjungma@eit.uni-kl.de                        |                          |
31012027Sjungma@eit.uni-kl.de                        +      ALIGNMEBNT PAD      +
31112027Sjungma@eit.uni-kl.de                               ..............
31212027Sjungma@eit.uni-kl.de                        +       (if needed)        +
31312027Sjungma@eit.uni-kl.de                        |                          |
31412027Sjungma@eit.uni-kl.de                        +--------------------------+
31512027Sjungma@eit.uni-kl.de top + 8 ->             |         CR SAVE          |
31612027Sjungma@eit.uni-kl.de                        +--------------------------+
31712027Sjungma@eit.uni-kl.de                        |                          |
31812027Sjungma@eit.uni-kl.de                        +       LINKAGE AREA       +
31912027Sjungma@eit.uni-kl.de top ->                 |                          |
32012027Sjungma@eit.uni-kl.de                        +==========================+
32112027Sjungma@eit.uni-kl.de */
32212027Sjungma@eit.uni-kl.de
32312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_BLOCKI_FRAME_SIZE \
32412027Sjungma@eit.uni-kl.de	PPC_ROUND_STACK(PPC_LINKAGE_AREA+4+PPC_GPR_SAVE_AREA)
32512027Sjungma@eit.uni-kl.de
32612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_BLOCKI_CR_SAVE 8
32712027Sjungma@eit.uni-kl.de
32812027Sjungma@eit.uni-kl.de/* Offset to the base of the GPR save area. Save from GPR13 to GPR31
32912027Sjungma@eit.uni-kl.de * increasing address.
33012027Sjungma@eit.uni-kl.de */
33112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_BLOCKI_GPR_SAVE(i) (QUICKTHREADS_BLOCKI_FRAME_SIZE-4+(i-31)*4)
33212027Sjungma@eit.uni-kl.de
33312027Sjungma@eit.uni-kl.de
33412027Sjungma@eit.uni-kl.de
33512027Sjungma@eit.uni-kl.de/* Define the "qt_block" stack frame. Notice that since "qt_black" calls
33612027Sjungma@eit.uni-kl.de * "qt_blocki", GPR registers are saved into "qt_blocki" stack frame.
33712027Sjungma@eit.uni-kl.de *
33812027Sjungma@eit.uni-kl.de
33912027Sjungma@eit.uni-kl.de top + S ->
34012027Sjungma@eit.uni-kl.de                        +==========================+
34112027Sjungma@eit.uni-kl.de top + S - 8 ->         |                          | FPR31
34212027Sjungma@eit.uni-kl.de                        +      FPR SAVE AREA       +
34312027Sjungma@eit.uni-kl.de                               ..............
34412027Sjungma@eit.uni-kl.de                        +                          +
34512027Sjungma@eit.uni-kl.de top + S - 18 * 8 ->    |                          | FPR14
34612027Sjungma@eit.uni-kl.de                        +--------------------------+
34712027Sjungma@eit.uni-kl.de                        |                          |
34812027Sjungma@eit.uni-kl.de                        +      ALIGNMEBNT PAD      +
34912027Sjungma@eit.uni-kl.de                               ..............
35012027Sjungma@eit.uni-kl.de                        +       (if needed)        +
35112027Sjungma@eit.uni-kl.de                        |                          |
35212027Sjungma@eit.uni-kl.de                        +--------------------------+
35312027Sjungma@eit.uni-kl.de                        |                          |
35412027Sjungma@eit.uni-kl.de                        +       LINKAGE AREA       +
35512027Sjungma@eit.uni-kl.de top ->                 |                          |
35612027Sjungma@eit.uni-kl.de                        +==========================+
35712027Sjungma@eit.uni-kl.de */
35812027Sjungma@eit.uni-kl.de
35912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_BLOCK_FRAME_SIZE \
36012027Sjungma@eit.uni-kl.de	PPC_ROUND_STACK(PPC_LINKAGE_AREA+PPC_FPR_SAVE_AREA)
36112027Sjungma@eit.uni-kl.de
36212027Sjungma@eit.uni-kl.de/* Offset to the location where registers are saved.
36312027Sjungma@eit.uni-kl.de */
36412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_BLOCK_FPR_SAVE(i) (QUICKTHREADS_BLOCK_FRAME_SIZE-8+(i-31)*8)
36512027Sjungma@eit.uni-kl.de
36612027Sjungma@eit.uni-kl.de
36712027Sjungma@eit.uni-kl.de/* Define the "qt_start" frame size. It consists just of the linkage area and
36812027Sjungma@eit.uni-kl.de * the parameter area.
36912027Sjungma@eit.uni-kl.de *
37012027Sjungma@eit.uni-kl.de
37112027Sjungma@eit.uni-kl.de                        +==========================+
37212027Sjungma@eit.uni-kl.de                        |                          |
37312027Sjungma@eit.uni-kl.de                        +      ALIGNMEBNT PAD      +
37412027Sjungma@eit.uni-kl.de                               ..............
37512027Sjungma@eit.uni-kl.de                        +       (if needed)        +
37612027Sjungma@eit.uni-kl.de                        |                          |
37712027Sjungma@eit.uni-kl.de                        +--------------------------+
37812027Sjungma@eit.uni-kl.de                        |                          | only par
37912027Sjungma@eit.uni-kl.de                        +                          +
38012027Sjungma@eit.uni-kl.de                        |                          | userf par
38112027Sjungma@eit.uni-kl.de                        +      PARAMETER AREA      +
38212027Sjungma@eit.uni-kl.de                        |                          | t par
38312027Sjungma@eit.uni-kl.de                        +                          +
38412027Sjungma@eit.uni-kl.de top + 8 ->             |                          | u par
38512027Sjungma@eit.uni-kl.de                        +--------------------------+
38612027Sjungma@eit.uni-kl.de                        |                          |
38712027Sjungma@eit.uni-kl.de                        +       LINKAGE AREA       +
38812027Sjungma@eit.uni-kl.de top ->                 |                          |
38912027Sjungma@eit.uni-kl.de                        +==========================+
39012027Sjungma@eit.uni-kl.de
39112027Sjungma@eit.uni-kl.de */
39212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_START_FRAME_SIZE PPC_ROUND_STACK(PPC_LINKAGE_AREA+PPC_PARAM_AREA(4))
39312027Sjungma@eit.uni-kl.de
39412027Sjungma@eit.uni-kl.de
39512027Sjungma@eit.uni-kl.de
39612027Sjungma@eit.uni-kl.de/* Define the "qt_vstart" frame. It consists of the linkage area, the fix parameter
39712027Sjungma@eit.uni-kl.de * area, the variant argument list and a local variable area used in "qt_vstart"
39812027Sjungma@eit.uni-kl.de * implementation.
39912027Sjungma@eit.uni-kl.de *
40012027Sjungma@eit.uni-kl.de
40112027Sjungma@eit.uni-kl.de backchain ->
40212027Sjungma@eit.uni-kl.de                        +==========================+
40312027Sjungma@eit.uni-kl.de backchain - 4 ->       |                          |
40412027Sjungma@eit.uni-kl.de                        +   LOCAL VARIABLES AREA   +
40512027Sjungma@eit.uni-kl.de                               ..............
40612027Sjungma@eit.uni-kl.de                        +                          +
40712027Sjungma@eit.uni-kl.de                        |                          |
40812027Sjungma@eit.uni-kl.de                        +--------------------------+
40912027Sjungma@eit.uni-kl.de                        |                          |
41012027Sjungma@eit.uni-kl.de                        +      ALIGNMEBNT PAD      +
41112027Sjungma@eit.uni-kl.de                               ..............
41212027Sjungma@eit.uni-kl.de                        +       (if needed)        +
41312027Sjungma@eit.uni-kl.de                        |                          |
41412027Sjungma@eit.uni-kl.de                        +--------------------------+
41512027Sjungma@eit.uni-kl.de                        |                          | arg(n)
41612027Sjungma@eit.uni-kl.de                        +                          +
41712027Sjungma@eit.uni-kl.de                        |                          |
41812027Sjungma@eit.uni-kl.de                        +  VARIABLE ARGUMENT LIST  +
41912027Sjungma@eit.uni-kl.de                               ..............
42012027Sjungma@eit.uni-kl.de                        +      for userf call      +
42112027Sjungma@eit.uni-kl.de                        |                          | arg(1)
42212027Sjungma@eit.uni-kl.de                        +                          +
42312027Sjungma@eit.uni-kl.de top + 8 + 16 ->        |                          | arg(0)
42412027Sjungma@eit.uni-kl.de                        +--------------------------+
42512027Sjungma@eit.uni-kl.de                        |                          | cleanup par
42612027Sjungma@eit.uni-kl.de                        +                          +
42712027Sjungma@eit.uni-kl.de                        |                          | userf par
42812027Sjungma@eit.uni-kl.de                        +      PARAMETER AREA      +
42912027Sjungma@eit.uni-kl.de                        |                          | startup par
43012027Sjungma@eit.uni-kl.de                        +                          +
43112027Sjungma@eit.uni-kl.de top + 8 ->             |                          | t par
43212027Sjungma@eit.uni-kl.de                        +--------------------------+
43312027Sjungma@eit.uni-kl.de                        |                          |
43412027Sjungma@eit.uni-kl.de                        +       LINKAGE AREA       +
43512027Sjungma@eit.uni-kl.de top ->                 |                          |
43612027Sjungma@eit.uni-kl.de                        +==========================+
43712027Sjungma@eit.uni-kl.de
43812027Sjungma@eit.uni-kl.de */
43912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_LOCAL_AREA (4*4)		/* local variable area */
44012027Sjungma@eit.uni-kl.de
44112027Sjungma@eit.uni-kl.de/* The offset the stack will be moved back before to call "userf(...)".
44212027Sjungma@eit.uni-kl.de * The linckage area must be moved to be adiacent to the part of the variant
44312027Sjungma@eit.uni-kl.de * argument list that is in the stack. Notice that, since the first 8
44412027Sjungma@eit.uni-kl.de * parameters are passed via registers, the offset is equal to the size of
44512027Sjungma@eit.uni-kl.de * 4+8 parameters. */
44612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_BKOFF PPC_PARAM_AREA(4+8)
44712027Sjungma@eit.uni-kl.de
44812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTART_FRAME_SIZE(varbytes) \
44912027Sjungma@eit.uni-kl.de	PPC_ROUND_STACK(PPC_LINKAGE_AREA+QUICKTHREADS_VARGS_BKOFF+(varbytes)+ \
45012027Sjungma@eit.uni-kl.de		QUICKTHREADS_VARGS_LOCAL_AREA)
45112027Sjungma@eit.uni-kl.de
45212027Sjungma@eit.uni-kl.de/* Offset to the base of the varian argument list */
45312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTART_LIST_BASE (PPC_LINKAGE_AREA+PPC_PARAM_AREA(4))
45412027Sjungma@eit.uni-kl.de
45512027Sjungma@eit.uni-kl.de
45612027Sjungma@eit.uni-kl.de/* Notice that qt_start and qt_vstart have no parameters, actually their
45712027Sjungma@eit.uni-kl.de * parameters are written in their stack frame during thread initialization
45812027Sjungma@eit.uni-kl.de */
45912027Sjungma@eit.uni-kl.deextern void qt_start(void);
46012027Sjungma@eit.uni-kl.deextern void qt_vstart(void);
46112027Sjungma@eit.uni-kl.de
46212027Sjungma@eit.uni-kl.de
46312027Sjungma@eit.uni-kl.de
46412027Sjungma@eit.uni-kl.de/* Offset (in words) of the location where the block routine saves its return
46512027Sjungma@eit.uni-kl.de * address (i.e. LR). SP points the top of the block routine stack and,
46612027Sjungma@eit.uni-kl.de * following ppc calling conventions, the return address is saved in the
46712027Sjungma@eit.uni-kl.de * previous (caller's) stack frame.
46812027Sjungma@eit.uni-kl.de */
46912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_RETURN_INDEX ((QUICKTHREADS_BLOCKI_FRAME_SIZE+PPC_LR_SAVE)/sizeof(PPC_W))
47012027Sjungma@eit.uni-kl.de
47112027Sjungma@eit.uni-kl.de/* static variable used to get the stack bottom in "VARGS" initialization */
47212027Sjungma@eit.uni-kl.destatic void *qt_sp_bottom_save;
47312027Sjungma@eit.uni-kl.de
47412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARG_INDEX(i) ((QUICKTHREADS_BLOCKI_FRAME_SIZE+PPC_PAR(i))/sizeof(PPC_W))
47512027Sjungma@eit.uni-kl.de
47612027Sjungma@eit.uni-kl.de/*****************************************************************************
47712027Sjungma@eit.uni-kl.de
47812027Sjungma@eit.uni-kl.de	QuickThreads needed definitions
47912027Sjungma@eit.uni-kl.de
48012027Sjungma@eit.uni-kl.de *****************************************************************************/
48112027Sjungma@eit.uni-kl.de
48212027Sjungma@eit.uni-kl.de
48312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_GROW_DOWN
48412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKALIGN	PPC_STACK_INCR
48512027Sjungma@eit.uni-kl.detypedef PPC_W qt_word_t;
48612027Sjungma@eit.uni-kl.de
48712027Sjungma@eit.uni-kl.de
48812027Sjungma@eit.uni-kl.de/* This macro is used by "QUICKTHREADS_ARGS" to initialize a single argument thread.
48912027Sjungma@eit.uni-kl.de * - set "qt_start" as the "qt_block" or "qt_blocki" return address;
49012027Sjungma@eit.uni-kl.de * - set the top of the stack backchain;
49112027Sjungma@eit.uni-kl.de * - set the next backchain (not needed, but just to be "clean").
49212027Sjungma@eit.uni-kl.de */
49312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGS_MD(sp) \
49412027Sjungma@eit.uni-kl.de	(QUICKTHREADS_SPUT (sp, QUICKTHREADS_RETURN_INDEX, qt_start), \
49512027Sjungma@eit.uni-kl.de	QUICKTHREADS_SPUT (sp, 0, sp+QUICKTHREADS_BLOCKI_FRAME_SIZE), \
49612027Sjungma@eit.uni-kl.de	QUICKTHREADS_SPUT (sp, QUICKTHREADS_BLOCKI_FRAME_SIZE/sizeof(PPC_W), \
49712027Sjungma@eit.uni-kl.de		sp+QUICKTHREADS_BLOCKI_FRAME_SIZE+QUICKTHREADS_START_FRAME_SIZE))
49812027Sjungma@eit.uni-kl.de
49912027Sjungma@eit.uni-kl.de
50012027Sjungma@eit.uni-kl.de/* This macro is used by "QUICKTHREADS_VARGS" to initialize a variant argument thread.
50112027Sjungma@eit.uni-kl.de * It returns the pointer to the top of the argument list.
50212027Sjungma@eit.uni-kl.de * We also use it to get the stack bottom via a static variable. This is a bit
50312027Sjungma@eit.uni-kl.de * "dirty", it could be better to do it in "qt_vargs", but we don't want change
50412027Sjungma@eit.uni-kl.de * anything out of this file.
50512027Sjungma@eit.uni-kl.de * We need the stack bottom to allocate a local variable area used by
50612027Sjungma@eit.uni-kl.de * "qt_vstart".
50712027Sjungma@eit.uni-kl.de */
50812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD0(sp, varbytes) \
50912027Sjungma@eit.uni-kl.de  ((qt_sp_bottom_save = sp), \
51012027Sjungma@eit.uni-kl.de  ((qt_t *)(((char *)(sp)) - \
51112027Sjungma@eit.uni-kl.de		(QUICKTHREADS_VSTART_FRAME_SIZE(varbytes)-QUICKTHREADS_VSTART_LIST_BASE))))
51212027Sjungma@eit.uni-kl.de
51312027Sjungma@eit.uni-kl.de
51412027Sjungma@eit.uni-kl.de/* This macro is used by "QUICKTHREADS_VARGS" to initialize a variant argument thread.
51512027Sjungma@eit.uni-kl.de * - set "qt_start" as the "qt_block" or "qt_blocki" return address;
51612027Sjungma@eit.uni-kl.de * - set the top of the stackback chain;
51712027Sjungma@eit.uni-kl.de * - set the next backchain (it points the stack botton).
51812027Sjungma@eit.uni-kl.de */
51912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD1(sp) \
52012027Sjungma@eit.uni-kl.de	(QUICKTHREADS_SPUT (sp, QUICKTHREADS_RETURN_INDEX, qt_vstart), \
52112027Sjungma@eit.uni-kl.de	QUICKTHREADS_SPUT (sp, 0, sp+QUICKTHREADS_BLOCKI_FRAME_SIZE), \
52212027Sjungma@eit.uni-kl.de	QUICKTHREADS_SPUT (sp, (QUICKTHREADS_BLOCKI_FRAME_SIZE)/sizeof(PPC_W), \
52312027Sjungma@eit.uni-kl.de		qt_sp_bottom_save))
52412027Sjungma@eit.uni-kl.de
52512027Sjungma@eit.uni-kl.de
52612027Sjungma@eit.uni-kl.de/* Activate "qt_vargs" as the initialization routine for the variant
52712027Sjungma@eit.uni-kl.de * argument threads
52812027Sjungma@eit.uni-kl.de */
52912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_DEFAULT
53012027Sjungma@eit.uni-kl.de
53112027Sjungma@eit.uni-kl.de/* Override "qt_vargs" with "qt_vargs_stdarg".
53212027Sjungma@eit.uni-kl.de * On LinuxPPC "qt_vargs" doesn't work, "qt_vargs_stdarg" uses a more
53312027Sjungma@eit.uni-kl.de * standard way to retrieve arguments from the variant list.
53412027Sjungma@eit.uni-kl.de */
53512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS(sp, nbytes, vargs, pt, startup, vuserf, cleanup) \
53612027Sjungma@eit.uni-kl.de      ((qt_t *)qt_vargs_stdarg (sp, nbytes, vargs, pt, startup, vuserf, cleanup))
53712027Sjungma@eit.uni-kl.de
53812027Sjungma@eit.uni-kl.de
53912027Sjungma@eit.uni-kl.de/* This macro is used by "QUICKTHREADS_ADJ(sp)" to get the stack top form the stack
54012027Sjungma@eit.uni-kl.de * bottom during a single argument thread initialization.
54112027Sjungma@eit.uni-kl.de * It is the space we need to allocate for a single argument thread: the stack
54212027Sjungma@eit.uni-kl.de * frame for the block routine ("qt_block" or "qt_blocki") and for "qt_start".
54312027Sjungma@eit.uni-kl.de */
54412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKBASE \
54512027Sjungma@eit.uni-kl.de	(QUICKTHREADS_BLOCKI_FRAME_SIZE+QUICKTHREADS_START_FRAME_SIZE)
54612027Sjungma@eit.uni-kl.de
54712027Sjungma@eit.uni-kl.de/* This macro is used by "QUICKTHREADS_VADJ(sp)" to get the stack top from the base
54812027Sjungma@eit.uni-kl.de * of the variant argument list during a variant argument thread initialization.
54912027Sjungma@eit.uni-kl.de */
55012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTKBASE	(QUICKTHREADS_BLOCKI_FRAME_SIZE+QUICKTHREADS_VSTART_LIST_BASE)
55112027Sjungma@eit.uni-kl.de
55212027Sjungma@eit.uni-kl.de/* The *index* (positive offset) of where to put each value. */
55312027Sjungma@eit.uni-kl.de
55412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGU_INDEX	QUICKTHREADS_ARG_INDEX(0)
55512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGT_INDEX	QUICKTHREADS_ARG_INDEX(1)
55612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_USER_INDEX	QUICKTHREADS_ARG_INDEX(2)
55712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ONLY_INDEX	QUICKTHREADS_ARG_INDEX(3)
55812027Sjungma@eit.uni-kl.de
55912027Sjungma@eit.uni-kl.de
56012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGT_INDEX		QUICKTHREADS_ARG_INDEX(0)
56112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTARTUP_INDEX	QUICKTHREADS_ARG_INDEX(1)
56212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VUSERF_INDEX		QUICKTHREADS_ARG_INDEX(2)
56312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VCLEANUP_INDEX	QUICKTHREADS_ARG_INDEX(3)
56412027Sjungma@eit.uni-kl.de
56512027Sjungma@eit.uni-kl.de#endif /* ndef QUICKTHREADS_POWERPC_H */
56612027Sjungma@eit.uni-kl.de
567