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_386_H 1512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_386_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/* Thread's initial stack layout on the i386: 2012027Sjungma@eit.uni-kl.de 2112027Sjungma@eit.uni-kl.de non-varargs: 2212027Sjungma@eit.uni-kl.de 2312027Sjungma@eit.uni-kl.de +--- 2412027Sjungma@eit.uni-kl.de | arg[2] === `userf' on startup 2512027Sjungma@eit.uni-kl.de | arg[1] === `pt' on startup 2612027Sjungma@eit.uni-kl.de | arg[0] === `pu' on startup 2712027Sjungma@eit.uni-kl.de +--- 2812027Sjungma@eit.uni-kl.de | ret pc === qt_error 2912027Sjungma@eit.uni-kl.de +--- 3012027Sjungma@eit.uni-kl.de | ret pc === `only' on startup 3112027Sjungma@eit.uni-kl.de +--- 3212027Sjungma@eit.uni-kl.de | %ebp 3312027Sjungma@eit.uni-kl.de | %esi 3412027Sjungma@eit.uni-kl.de | %edi 3512027Sjungma@eit.uni-kl.de | %ebx <--- qt_t.sp 3612027Sjungma@eit.uni-kl.de +--- 3712027Sjungma@eit.uni-kl.de 3812027Sjungma@eit.uni-kl.de When a non-varargs thread is started, it ``returns'' directly to 3912027Sjungma@eit.uni-kl.de the client's `only' function. 4012027Sjungma@eit.uni-kl.de 4112027Sjungma@eit.uni-kl.de varargs: 4212027Sjungma@eit.uni-kl.de 4312027Sjungma@eit.uni-kl.de +--- 4412027Sjungma@eit.uni-kl.de | arg[n-1] 4512027Sjungma@eit.uni-kl.de | .. 4612027Sjungma@eit.uni-kl.de | arg[0] 4712027Sjungma@eit.uni-kl.de +--- 4812027Sjungma@eit.uni-kl.de | ret pc === `qt_vstart' 4912027Sjungma@eit.uni-kl.de +--- 5012027Sjungma@eit.uni-kl.de | %ebp === `startup' 5112027Sjungma@eit.uni-kl.de | %esi === `cleanup' 5212027Sjungma@eit.uni-kl.de | %edi === `pt' 5312027Sjungma@eit.uni-kl.de | %ebx === `vuserf' <--- qt_t.sp 5412027Sjungma@eit.uni-kl.de +--- 5512027Sjungma@eit.uni-kl.de 5612027Sjungma@eit.uni-kl.de When a varargs thread is started, it ``returns'' to the `qt_vstart' 5712027Sjungma@eit.uni-kl.de startup code. The startup code calls the appropriate functions. */ 5812027Sjungma@eit.uni-kl.de 5912027Sjungma@eit.uni-kl.de 6012027Sjungma@eit.uni-kl.de/* What to do to start a varargs thread running. */ 6112027Sjungma@eit.uni-kl.deextern void qt_vstart (void); 6212027Sjungma@eit.uni-kl.de 6312027Sjungma@eit.uni-kl.de 6412027Sjungma@eit.uni-kl.de/* Hold 4 saved regs plus two return pcs (qt_error, qt_start) plus 6512027Sjungma@eit.uni-kl.de three args. */ 6612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKBASE (13 * 4) 6712027Sjungma@eit.uni-kl.de 6812027Sjungma@eit.uni-kl.de/* Hold 4 saved regs plus one return pc (qt_vstart). */ 6912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTKBASE (5 * 4) 7012027Sjungma@eit.uni-kl.de 7112027Sjungma@eit.uni-kl.de 7212027Sjungma@eit.uni-kl.de/* Stack must be 16-byte aligned at function call instr. (SSE data support) */ 7312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKALIGN (16) 7412027Sjungma@eit.uni-kl.de 7512027Sjungma@eit.uni-kl.de 7612027Sjungma@eit.uni-kl.de/* Where to place various arguments. */ 7712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ONLY_INDEX (QUICKTHREADS_PC) 7812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_USER_INDEX (QUICKTHREADS_ARG2) 7912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGT_INDEX (QUICKTHREADS_ARG1) 8012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGU_INDEX (QUICKTHREADS_ARG0) 8112027Sjungma@eit.uni-kl.de 8212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTARTUP_INDEX (QUICKTHREADS_EBP) 8312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VUSERF_INDEX (QUICKTHREADS_EBX) 8412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VCLEANUP_INDEX (QUICKTHREADS_ESI) 8512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGT_INDEX (QUICKTHREADS_EDI) 8612027Sjungma@eit.uni-kl.de 8712027Sjungma@eit.uni-kl.de 8812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_EBX 0 8912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_EDI 1 9012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ESI 2 9112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_EBP 3 9212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_POP0 4 9312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_POP1 5 9412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_POP2 6 9512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_PC 7 9612027Sjungma@eit.uni-kl.de/* The following are defined only for non-varargs. */ 9712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_POPE 8 9812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARG0 9 9912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARG1 10 10012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARG2 11 10112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_RPC 12 10212027Sjungma@eit.uni-kl.de 10312027Sjungma@eit.uni-kl.de 10412027Sjungma@eit.uni-kl.de/* Stack grows down. The top of the stack is the first thing to 10512027Sjungma@eit.uni-kl.de pop off (preincrement, postdecrement). */ 10612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_GROW_DOWN 10712027Sjungma@eit.uni-kl.de 10812027Sjungma@eit.uni-kl.deextern void qt_error (void); 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.de/* For correct 16-byte stack alignment (auto-relocatable functions) */ 11112027Sjungma@eit.uni-kl.deextern void qt_tramp (void); 11212027Sjungma@eit.uni-kl.deextern void qt_align (void); 11312027Sjungma@eit.uni-kl.de 11412027Sjungma@eit.uni-kl.de/* Push on the error return address and the alignment/trampoline functions. */ 11512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGS_MD(sto) \ 11612027Sjungma@eit.uni-kl.de (QUICKTHREADS_SPUT (sto, QUICKTHREADS_POP0, qt_align), \ 11712027Sjungma@eit.uni-kl.de QUICKTHREADS_SPUT (sto, QUICKTHREADS_POP1, qt_align), \ 11812027Sjungma@eit.uni-kl.de QUICKTHREADS_SPUT (sto, QUICKTHREADS_POP2, qt_align), \ 11912027Sjungma@eit.uni-kl.de QUICKTHREADS_SPUT (sto, QUICKTHREADS_POPE, qt_tramp), \ 12012027Sjungma@eit.uni-kl.de QUICKTHREADS_SPUT (sto, QUICKTHREADS_RPC, qt_error)) 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.de 12312027Sjungma@eit.uni-kl.de/* When varargs are pushed, allocate space for all the args. */ 12412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD0(sto, nbytes) \ 12512027Sjungma@eit.uni-kl.de ((qt_t *)(((char *)(sto)) - QUICKTHREADS_STKROUNDUP(nbytes))) 12612027Sjungma@eit.uni-kl.de 12712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD1(sto) \ 12812027Sjungma@eit.uni-kl.de (QUICKTHREADS_SPUT (sto, QUICKTHREADS_PC, qt_vstart)) 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_DEFAULT 13112027Sjungma@eit.uni-kl.de 13212027Sjungma@eit.uni-kl.de#endif /* QUICKTHREADS_386_H */ 133