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/* 1512027Sjungma@eit.uni-kl.de * This file (pa-risc.h) is part of the port of QuickThreads for the 1612027Sjungma@eit.uni-kl.de * PA-RISC 1.1 architecture. This file is a machine dependent header 1712027Sjungma@eit.uni-kl.de * file. It was written in 1994 by Uwe Reder 1812027Sjungma@eit.uni-kl.de * (`uereder@cip.informatik.uni-erlangen.de') for the Operating Systems 1912027Sjungma@eit.uni-kl.de * Department (IMMD4) at the University of Erlangen/Nuernberg Germany. 2012027Sjungma@eit.uni-kl.de */ 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de 2312027Sjungma@eit.uni-kl.de#ifndef QUICKTHREADS_PA_RISC_H 2412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_PA_RISC_H 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.de#if 0 2712027Sjungma@eit.uni-kl.de#include <qt.h> 2812027Sjungma@eit.uni-kl.de#endif 2912027Sjungma@eit.uni-kl.de 3012027Sjungma@eit.uni-kl.de/* size of an integer-register (32 bit) */ 3112027Sjungma@eit.uni-kl.detypedef unsigned long qt_word_t; 3212027Sjungma@eit.uni-kl.de 3312027Sjungma@eit.uni-kl.de/* PA-RISC's stack grows up */ 3412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_GROW_UP 3512027Sjungma@eit.uni-kl.de 3612027Sjungma@eit.uni-kl.de/* Stack layout on PA-RISC according to PA-RISC Procedure Calling Conventions: 3712027Sjungma@eit.uni-kl.de 3812027Sjungma@eit.uni-kl.de Callee-save registers are: gr3-gr18, fr12-fr21. 3912027Sjungma@eit.uni-kl.de Also save gr2, return pointer. 4012027Sjungma@eit.uni-kl.de 4112027Sjungma@eit.uni-kl.de +--- 4212027Sjungma@eit.uni-kl.de | fr12 Each floating register is a double word (8 bytes). 4312027Sjungma@eit.uni-kl.de | fr13 Floating registers are only saved if `qt_block' is 4412027Sjungma@eit.uni-kl.de | fr14 called, in which case it saves the floating-point 4512027Sjungma@eit.uni-kl.de | fr15 registers then calls `qt_blocki' to save the integer 4612027Sjungma@eit.uni-kl.de | fr16 registers. 4712027Sjungma@eit.uni-kl.de | fr17 4812027Sjungma@eit.uni-kl.de | fr18 4912027Sjungma@eit.uni-kl.de | fr19 5012027Sjungma@eit.uni-kl.de | fr20 5112027Sjungma@eit.uni-kl.de | fr21 5212027Sjungma@eit.uni-kl.de | <arg word 3> fixed arguments (must be allocated; may remain unused) 5312027Sjungma@eit.uni-kl.de | <arg word 2> 5412027Sjungma@eit.uni-kl.de | <arg word 1> 5512027Sjungma@eit.uni-kl.de | <arg word 0> 5612027Sjungma@eit.uni-kl.de | <LPT> frame marker 5712027Sjungma@eit.uni-kl.de | <LPT'> 5812027Sjungma@eit.uni-kl.de | <RP'> 5912027Sjungma@eit.uni-kl.de | <Current RP> 6012027Sjungma@eit.uni-kl.de | <Static Link> 6112027Sjungma@eit.uni-kl.de | <Clean Up> 6212027Sjungma@eit.uni-kl.de | <RP''> 6312027Sjungma@eit.uni-kl.de | <Previous SP> 6412027Sjungma@eit.uni-kl.de +--- 6512027Sjungma@eit.uni-kl.de | gr3 word each (4 bytes) 6612027Sjungma@eit.uni-kl.de | gr4 6712027Sjungma@eit.uni-kl.de | gr5 6812027Sjungma@eit.uni-kl.de | gr6 6912027Sjungma@eit.uni-kl.de | gr7 7012027Sjungma@eit.uni-kl.de | gr8 7112027Sjungma@eit.uni-kl.de | gr9 7212027Sjungma@eit.uni-kl.de | gr10 7312027Sjungma@eit.uni-kl.de | gr11 7412027Sjungma@eit.uni-kl.de | gr12 7512027Sjungma@eit.uni-kl.de | gr13 7612027Sjungma@eit.uni-kl.de | gr14 7712027Sjungma@eit.uni-kl.de | gr15 7812027Sjungma@eit.uni-kl.de | gr16 7912027Sjungma@eit.uni-kl.de | gr17 8012027Sjungma@eit.uni-kl.de | gr18 8112027Sjungma@eit.uni-kl.de | <16 bytes filled in (sp has to be 64-bytes aligned)> 8212027Sjungma@eit.uni-kl.de | <arg word 3> fixed arguments (must be allocated; may remain unused) 8312027Sjungma@eit.uni-kl.de | <arg word 2> 8412027Sjungma@eit.uni-kl.de | <arg word 1> 8512027Sjungma@eit.uni-kl.de | <arg word 0> 8612027Sjungma@eit.uni-kl.de | <LPT> frame marker 8712027Sjungma@eit.uni-kl.de | <LPT'> 8812027Sjungma@eit.uni-kl.de | <RP'> 8912027Sjungma@eit.uni-kl.de | <Current RP> 9012027Sjungma@eit.uni-kl.de | <Static Link> 9112027Sjungma@eit.uni-kl.de | <Clean Up> 9212027Sjungma@eit.uni-kl.de | <RP''> 9312027Sjungma@eit.uni-kl.de | <Previous SP> 9412027Sjungma@eit.uni-kl.de +--- <--- sp 9512027Sjungma@eit.uni-kl.de*/ 9612027Sjungma@eit.uni-kl.de 9712027Sjungma@eit.uni-kl.de/* When a never-before-run thread is restored, the return pc points 9812027Sjungma@eit.uni-kl.de to a fragment of code that starts the thread running. For 9912027Sjungma@eit.uni-kl.de non-vargs functions, it just calls the client's `only' function. 10012027Sjungma@eit.uni-kl.de For varargs functions, it calls the startup, user, and cleanup 10112027Sjungma@eit.uni-kl.de functions. */ 10212027Sjungma@eit.uni-kl.de 10312027Sjungma@eit.uni-kl.de/* Note: Procedue Labels on PA-RISC 10412027Sjungma@eit.uni-kl.de 10512027Sjungma@eit.uni-kl.de <--2--><-------28---------><1-><1-> 10612027Sjungma@eit.uni-kl.de ----------------------------------- 10712027Sjungma@eit.uni-kl.de | SID | Adress Part | L | X | 10812027Sjungma@eit.uni-kl.de ----------------------------------- 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.de On HP-UX the L field is used to flag wheather the procedure 11112027Sjungma@eit.uni-kl.de label (plabel) is a pointer to an LT entry or to the entry point 11212027Sjungma@eit.uni-kl.de of the procedure (PA-RISC Procedure Calling Conventions Reference 11312027Sjungma@eit.uni-kl.de Manual, 5.3.2 Procedure Labels and Dynamic Calls). */ 11412027Sjungma@eit.uni-kl.de 11512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_PA_RISC_READ_PLABEL(plabel) \ 11612027Sjungma@eit.uni-kl.de ( (((int)plabel) & 2) ? \ 11712027Sjungma@eit.uni-kl.de ( (*((int *)(((int)plabel) & 0xfffffffc)))) : ((int)plabel) ) 11812027Sjungma@eit.uni-kl.de 11912027Sjungma@eit.uni-kl.de/* Stack must be 64 bytes aligned. */ 12012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKALIGN (64) 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.de/* Internal helper for putting stuff on stack (negative index!). */ 12312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_SPUT(top, at, val) \ 12412027Sjungma@eit.uni-kl.de (((qt_word_t *)(top))[-(at)] = (qt_word_t)(val)) 12512027Sjungma@eit.uni-kl.de 12612027Sjungma@eit.uni-kl.de/* Offsets of various registers which are modified on the stack. 12712027Sjungma@eit.uni-kl.de rp (return-pointer) has to be stored in the frame-marker-area 12812027Sjungma@eit.uni-kl.de of the "older" stack-segment. */ 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_crp (12+4+16+5) 13112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_15 (12+4+4) 13212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_16 (12+4+3) 13312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_17 (12+4+2) 13412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_18 (12+4+1) 13512027Sjungma@eit.uni-kl.de 13612027Sjungma@eit.uni-kl.de 13712027Sjungma@eit.uni-kl.de/** This stuff is for NON-VARARGS. **/ 13812027Sjungma@eit.uni-kl.de 13912027Sjungma@eit.uni-kl.de/* Stack looks like this (2 stack frames): 14012027Sjungma@eit.uni-kl.de 14112027Sjungma@eit.uni-kl.de <--- 64-bytes aligned --><------- 64-bytes aligned ------------> 14212027Sjungma@eit.uni-kl.de | || | 14312027Sjungma@eit.uni-kl.de <--16--><------48-------><----16*4-----><--16-><------48-------> 14412027Sjungma@eit.uni-kl.de || | || | | || 14512027Sjungma@eit.uni-kl.de ||filler|arg|frame-marker||register-save|filler|arg|frame-marker|| 14612027Sjungma@eit.uni-kl.de ------------------------------------------------------------------ 14712027Sjungma@eit.uni-kl.de */ 14812027Sjungma@eit.uni-kl.de 14912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKBASE (16+48+(16*sizeof(qt_word_t))+16+48) 15012027Sjungma@eit.uni-kl.de 15112027Sjungma@eit.uni-kl.de/* The index, relative to sp, of where to put each value. */ 15212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ONLY_INDEX (QUICKTHREADS_15) 15312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_USER_INDEX (QUICKTHREADS_16) 15412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGT_INDEX (QUICKTHREADS_17) 15512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGU_INDEX (QUICKTHREADS_18) 15612027Sjungma@eit.uni-kl.de 15712027Sjungma@eit.uni-kl.deextern void qt_start(void); 15812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGS_MD(sp) \ 15912027Sjungma@eit.uni-kl.de (QUICKTHREADS_SPUT (sp, QUICKTHREADS_crp, QUICKTHREADS_PA_RISC_READ_PLABEL(qt_start))) 16012027Sjungma@eit.uni-kl.de 16112027Sjungma@eit.uni-kl.de 16212027Sjungma@eit.uni-kl.de/** This is for VARARGS. **/ 16312027Sjungma@eit.uni-kl.de 16412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_DEFAULT 16512027Sjungma@eit.uni-kl.de 16612027Sjungma@eit.uni-kl.de/* Stack looks like this (2 stack frames): 16712027Sjungma@eit.uni-kl.de 16812027Sjungma@eit.uni-kl.de <------ 64-bytes aligned -------><--------- 64-bytes aligned ----------> 16912027Sjungma@eit.uni-kl.de | || | 17012027Sjungma@eit.uni-kl.de <---?--><--?---><16><----32-----><----16*4-----><-16--><16><----32-----> 17112027Sjungma@eit.uni-kl.de || | | | || | | | || 17212027Sjungma@eit.uni-kl.de ||filler|varargs|arg|frame-marker||register-save|filler|arg|frame-marker|| 17312027Sjungma@eit.uni-kl.de -------------------------------------------------------------------------- 17412027Sjungma@eit.uni-kl.de */ 17512027Sjungma@eit.uni-kl.de 17612027Sjungma@eit.uni-kl.de/* Sp is moved to the end of the first stack frame. */ 17712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD0(sp, vasize) \ 17812027Sjungma@eit.uni-kl.de ((qt_t *)(((char *)sp) + QUICKTHREADS_STKROUNDUP(vasize + 4*4 + 32))) 17912027Sjungma@eit.uni-kl.de 18012027Sjungma@eit.uni-kl.de/* To reach the arguments from the end of the first stack frame use 32 18112027Sjungma@eit.uni-kl.de as a negative adjustment. */ 18212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_ADJUST(sp) ((qt_t *)(((char *)sp) - 32)) 18312027Sjungma@eit.uni-kl.de 18412027Sjungma@eit.uni-kl.de/* Offset to reach the end of the second stack frame. */ 18512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTKBASE ((16*sizeof(qt_word_t)) + 16 + 4*4 + 32) 18612027Sjungma@eit.uni-kl.de 18712027Sjungma@eit.uni-kl.deextern void qt_vstart(void); 18812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD1(sp) \ 18912027Sjungma@eit.uni-kl.de (QUICKTHREADS_SPUT (sp, QUICKTHREADS_crp, QUICKTHREADS_PA_RISC_READ_PLABEL(qt_vstart))) 19012027Sjungma@eit.uni-kl.de 19112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGT_INDEX (QUICKTHREADS_15) 19212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTARTUP_INDEX (QUICKTHREADS_16) 19312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VUSERF_INDEX (QUICKTHREADS_17) 19412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VCLEANUP_INDEX (QUICKTHREADS_18) 19512027Sjungma@eit.uni-kl.de 19612027Sjungma@eit.uni-kl.de#endif /* ndef QUICKTHREADS_PA_RISC_H */ 197