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#ifndef QUICKTHREADS_M88K_H 1512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_M88K_H 1612027Sjungma@eit.uni-kl.de 1712027Sjungma@eit.uni-kl.detypedef unsigned long qt_word_t; 1812027Sjungma@eit.uni-kl.de 1912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_GROW_DOWN 2012027Sjungma@eit.uni-kl.de 2112027Sjungma@eit.uni-kl.de/* Stack layout on the mips: 2212027Sjungma@eit.uni-kl.de 2312027Sjungma@eit.uni-kl.de Callee-save registers are: $16-$23, $30; $f20-$f30. 2412027Sjungma@eit.uni-kl.de Also save $31, return pc. 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.de Non-varargs: 2712027Sjungma@eit.uni-kl.de 2812027Sjungma@eit.uni-kl.de +--- 2912027Sjungma@eit.uni-kl.de | r30 (fp) on startup === 0 3012027Sjungma@eit.uni-kl.de | r25 3112027Sjungma@eit.uni-kl.de | r24 3212027Sjungma@eit.uni-kl.de | r23 3312027Sjungma@eit.uni-kl.de | r22 3412027Sjungma@eit.uni-kl.de | r21 3512027Sjungma@eit.uni-kl.de | r20 3612027Sjungma@eit.uni-kl.de | r19 3712027Sjungma@eit.uni-kl.de | r18 3812027Sjungma@eit.uni-kl.de | r17 on startup === `only' 3912027Sjungma@eit.uni-kl.de | r16 on startup === `userf' 4012027Sjungma@eit.uni-kl.de | r15 on startup === `pt' 4112027Sjungma@eit.uni-kl.de | r14 on startup === `pu' 4212027Sjungma@eit.uni-kl.de | r1 on startup === `qt_start' 4312027Sjungma@eit.uni-kl.de | 0 4412027Sjungma@eit.uni-kl.de | 0 4512027Sjungma@eit.uni-kl.de +--- 4612027Sjungma@eit.uni-kl.de | 0 4712027Sjungma@eit.uni-kl.de | ... (8 regs worth === 32 bytes of homing area) 4812027Sjungma@eit.uni-kl.de | 0 <--- sp 4912027Sjungma@eit.uni-kl.de +--- 5012027Sjungma@eit.uni-kl.de 5112027Sjungma@eit.uni-kl.de Conventions for varargs: 5212027Sjungma@eit.uni-kl.de 5312027Sjungma@eit.uni-kl.de | : 5412027Sjungma@eit.uni-kl.de | arg8 5512027Sjungma@eit.uni-kl.de +--- 5612027Sjungma@eit.uni-kl.de | r30 (fp) arg7 5712027Sjungma@eit.uni-kl.de | r25 arg6 5812027Sjungma@eit.uni-kl.de | r24 arg5 5912027Sjungma@eit.uni-kl.de | r23 arg4 6012027Sjungma@eit.uni-kl.de | r22 arg3 6112027Sjungma@eit.uni-kl.de | r21 arg2 6212027Sjungma@eit.uni-kl.de | r20 arg1 6312027Sjungma@eit.uni-kl.de | r19 arg0 6412027Sjungma@eit.uni-kl.de | r18 6512027Sjungma@eit.uni-kl.de | r17 on startup === `startup' 6612027Sjungma@eit.uni-kl.de | r16 on startup === `vuserf' 6712027Sjungma@eit.uni-kl.de | r15 on startup === `pt' 6812027Sjungma@eit.uni-kl.de | r14 on startup === `cleanup' 6912027Sjungma@eit.uni-kl.de | r1 on startup === `qt_vstart' 7012027Sjungma@eit.uni-kl.de | 0 7112027Sjungma@eit.uni-kl.de | 0 7212027Sjungma@eit.uni-kl.de +--- 7312027Sjungma@eit.uni-kl.de | 0 7412027Sjungma@eit.uni-kl.de | ... (8 regs worth === 32 bytes of homing area) 7512027Sjungma@eit.uni-kl.de | 0 <--- sp 7612027Sjungma@eit.uni-kl.de +--- 7712027Sjungma@eit.uni-kl.de 7812027Sjungma@eit.uni-kl.de */ 7912027Sjungma@eit.uni-kl.de 8012027Sjungma@eit.uni-kl.de 8112027Sjungma@eit.uni-kl.de/* Stack must be doubleword aligned. */ 8212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKALIGN (16) /* Doubleword aligned. */ 8312027Sjungma@eit.uni-kl.de 8412027Sjungma@eit.uni-kl.de/* How much space is allocated to hold all the crud for 8512027Sjungma@eit.uni-kl.de initialization: saved registers plus padding to keep the stack 8612027Sjungma@eit.uni-kl.de aligned plus 8 words of padding to use as a `homing area' (for 8712027Sjungma@eit.uni-kl.de r2-r9) when calling helper functions on the stack of the (not yet 8812027Sjungma@eit.uni-kl.de started) thread. The varargs save area is small because it gets 8912027Sjungma@eit.uni-kl.de overlapped with the top of the parameter list. In case the 9012027Sjungma@eit.uni-kl.de parameter list is less than 8 args, QUICKTHREADS_ARGS_MD0 adds some dead 9112027Sjungma@eit.uni-kl.de space at the top of the stack. */ 9212027Sjungma@eit.uni-kl.de 9312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKBASE (16*4 + 8*4) 9412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTKBASE (8*4 + 8*4) 9512027Sjungma@eit.uni-kl.de 9612027Sjungma@eit.uni-kl.de 9712027Sjungma@eit.uni-kl.de/* Index of various registers. */ 9812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_1 (8+2) 9912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_14 (8+3) 10012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_15 (8+4) 10112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_16 (8+5) 10212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_17 (8+6) 10312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_30 (8+15) 10412027Sjungma@eit.uni-kl.de 10512027Sjungma@eit.uni-kl.de 10612027Sjungma@eit.uni-kl.de/* When a never-before-run thread is restored, the return pc points 10712027Sjungma@eit.uni-kl.de to a fragment of code that starts the thread running. For 10812027Sjungma@eit.uni-kl.de non-vargs functions, it sets up arguments and calls the client's 10912027Sjungma@eit.uni-kl.de `only' function. For varargs functions, the startup code calls the 11012027Sjungma@eit.uni-kl.de startup, user, and cleanup functions. 11112027Sjungma@eit.uni-kl.de 11212027Sjungma@eit.uni-kl.de For non-varargs functions, we set the frame pointer to 0 to 11312027Sjungma@eit.uni-kl.de null-terminate the call chain. 11412027Sjungma@eit.uni-kl.de 11512027Sjungma@eit.uni-kl.de For varargs functions, the frame pointer register is used to hold 11612027Sjungma@eit.uni-kl.de one of the arguments, so that all arguments can be laid out in 11712027Sjungma@eit.uni-kl.de memory by the conventional `qt_vargs' varargs initialization 11812027Sjungma@eit.uni-kl.de routine. 11912027Sjungma@eit.uni-kl.de 12012027Sjungma@eit.uni-kl.de The varargs startup routine always reads 8 words of arguments from 12112027Sjungma@eit.uni-kl.de the stack. If there are less than 8 words of arguments, then the 12212027Sjungma@eit.uni-kl.de arg list could call off the top of the stack. To prevent fall-off, 12312027Sjungma@eit.uni-kl.de always allocate 8 words. */ 12412027Sjungma@eit.uni-kl.de 12512027Sjungma@eit.uni-kl.deextern void qt_start(void); 12612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGS_MD(sp) \ 12712027Sjungma@eit.uni-kl.de (QUICKTHREADS_SPUT (sp, QUICKTHREADS_1, qt_start), \ 12812027Sjungma@eit.uni-kl.de QUICKTHREADS_SPUT (sp, QUICKTHREADS_30, 0)) 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.de 13112027Sjungma@eit.uni-kl.de/* The m88k uses a struct for `va_list', so pass a pointer to the 13212027Sjungma@eit.uni-kl.de struct. */ 13312027Sjungma@eit.uni-kl.de 13412027Sjungma@eit.uni-kl.detypedef void (qt_function_t)(void); 13512027Sjungma@eit.uni-kl.de 13612027Sjungma@eit.uni-kl.destruct qt_t; 13712027Sjungma@eit.uni-kl.deextern struct qt_t *qt_vargs (struct qt_t *sp, int nbytes, 13812027Sjungma@eit.uni-kl.de void *vargs, void *pt, 13912027Sjungma@eit.uni-kl.de qt_function_t *startup, 14012027Sjungma@eit.uni-kl.de qt_function_t *vuserf, 14112027Sjungma@eit.uni-kl.de qt_function_t *cleanup); 14212027Sjungma@eit.uni-kl.de 14312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS(sp, nbytes, vargs, pt, startup, vuserf, cleanup) \ 14412027Sjungma@eit.uni-kl.de (qt_vargs (sp, nbytes, &(vargs), pt, (qt_function_t *)startup, \ 14512027Sjungma@eit.uni-kl.de (qt_function_t *)vuserf, (qt_function_t *)cleanup)) 14612027Sjungma@eit.uni-kl.de 14712027Sjungma@eit.uni-kl.de 14812027Sjungma@eit.uni-kl.de/* The *index* (positive offset) of where to put each value. */ 14912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ONLY_INDEX (QUICKTHREADS_17) 15012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_USER_INDEX (QUICKTHREADS_16) 15112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGT_INDEX (QUICKTHREADS_15) 15212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGU_INDEX (QUICKTHREADS_14) 15312027Sjungma@eit.uni-kl.de 15412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VCLEANUP_INDEX (QUICKTHREADS_14) 15512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VUSERF_INDEX (QUICKTHREADS_16) 15612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTARTUP_INDEX (QUICKTHREADS_17) 15712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGT_INDEX (QUICKTHREADS_15) 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de#endif /* ndef QUICKTHREADS_M88K_H */ 160