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