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_X86_64_H 1512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_X86_64_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 iX86_64: 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 four return pcs (qt_error, qt_start and twice qt_align) 6512027Sjungma@eit.uni-kl.de plus ten args and two qt_word_t's for correct alignment. */ 6612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKBASE (16 * sizeof(long)) 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 * sizeof(long)) 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/* Stack layout offsets relative to stack at initial stack setup. */ 8912027Sjungma@eit.uni-kl.de 9012027Sjungma@eit.uni-kl.de/* Stack alignment 15 */ 9112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_RPC 14 9212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_POP0 13 9312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_PC 12 9412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_POP1 11 9512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_RBP 10 9612027Sjungma@eit.uni-kl.de/* Stack alignment 9 */ 9712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_R12 8 9812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_R13 7 9912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_R14 6 10012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_R15 5 10112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_RBX 4 10212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_RCX 3 10312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_RDX 2 10412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_RDI 1 10512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_RSI 0 10612027Sjungma@eit.uni-kl.de 10712027Sjungma@eit.uni-kl.de 10812027Sjungma@eit.uni-kl.de/* Arguments to save stack function. */ 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARG0 QUICKTHREADS_RDI 11112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARG1 QUICKTHREADS_RSI 11212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARG2 QUICKTHREADS_RDX 11312027Sjungma@eit.uni-kl.de 11412027Sjungma@eit.uni-kl.de 11512027Sjungma@eit.uni-kl.de/* Stack grows down. The top of the stack is the first thing to 11612027Sjungma@eit.uni-kl.de pop off (preincrement, postdecrement). */ 11712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_GROW_DOWN 11812027Sjungma@eit.uni-kl.de 11912027Sjungma@eit.uni-kl.deextern void qt_error (void); 12012027Sjungma@eit.uni-kl.deextern void qt_align (void); /* For correct stack alignment */ 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.de/* Push on the error return address, force Frame Pointer to 0 and 12312027Sjungma@eit.uni-kl.de push stack alignment trampoline function. */ 12412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGS_MD(sto) \ 12512027Sjungma@eit.uni-kl.de (QUICKTHREADS_SPUT (sto, QUICKTHREADS_RBP, 0), \ 12612027Sjungma@eit.uni-kl.de QUICKTHREADS_SPUT (sto, QUICKTHREADS_POP0, qt_align), \ 12712027Sjungma@eit.uni-kl.de QUICKTHREADS_SPUT (sto, QUICKTHREADS_POP1, qt_align), \ 12812027Sjungma@eit.uni-kl.de QUICKTHREADS_SPUT (sto, QUICKTHREADS_RPC, qt_error)) 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.de 13112027Sjungma@eit.uni-kl.de/* When varargs are pushed, allocate space for all the args. */ 13212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD0(sto, nbytes) \ 13312027Sjungma@eit.uni-kl.de ((qt_t *)(((char *)(sto)) - QUICKTHREADS_STKROUNDUP(nbytes))) 13412027Sjungma@eit.uni-kl.de 13512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD1(sto) \ 13612027Sjungma@eit.uni-kl.de (QUICKTHREADS_SPUT (sto, QUICKTHREADS_PC, qt_vstart)) 13712027Sjungma@eit.uni-kl.de 13812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_DEFAULT 13912027Sjungma@eit.uni-kl.de 14012027Sjungma@eit.uni-kl.de#endif /* QUICKTHREADS_X86_64_H */ 141