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