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