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_AXP_H
1512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_AXP_H
1612027Sjungma@eit.uni-kl.de
1712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_GROW_DOWN
1812027Sjungma@eit.uni-kl.de
1912027Sjungma@eit.uni-kl.detypedef unsigned long qt_word_t;
2012027Sjungma@eit.uni-kl.de
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de/* Stack layout on the Alpha:
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de   Integer:
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de     Caller-save: r0..r8, r22..r25, r27..r29
2712027Sjungma@eit.uni-kl.de     argument/caller-save: r16..r21
2812027Sjungma@eit.uni-kl.de     callee-save: r9..r15
2912027Sjungma@eit.uni-kl.de     return pc *callee-save*: r26
3012027Sjungma@eit.uni-kl.de     stack pointer: r30
3112027Sjungma@eit.uni-kl.de     zero: r31
3212027Sjungma@eit.uni-kl.de
3312027Sjungma@eit.uni-kl.de   Floating-point:
3412027Sjungma@eit.uni-kl.de
3512027Sjungma@eit.uni-kl.de     Caller-save: f0..f1, f10..f15
3612027Sjungma@eit.uni-kl.de     argument/caller-save: f16..f21, f22..f30
3712027Sjungma@eit.uni-kl.de     callee-save: f2..f9
3812027Sjungma@eit.uni-kl.de     zero: f31
3912027Sjungma@eit.uni-kl.de
4012027Sjungma@eit.uni-kl.de   Non-varargs:
4112027Sjungma@eit.uni-kl.de
4212027Sjungma@eit.uni-kl.de   +---
4312027Sjungma@eit.uni-kl.de   | padding
4412027Sjungma@eit.uni-kl.de   | f9
4512027Sjungma@eit.uni-kl.de   | f8
4612027Sjungma@eit.uni-kl.de   | f7
4712027Sjungma@eit.uni-kl.de   | f6
4812027Sjungma@eit.uni-kl.de   | f5
4912027Sjungma@eit.uni-kl.de   | f4
5012027Sjungma@eit.uni-kl.de   | f3
5112027Sjungma@eit.uni-kl.de   | f2
5212027Sjungma@eit.uni-kl.de   | r26
5312027Sjungma@eit.uni-kl.de   +---
5412027Sjungma@eit.uni-kl.de   | padding
5512027Sjungma@eit.uni-kl.de   | r29
5612027Sjungma@eit.uni-kl.de   | r15
5712027Sjungma@eit.uni-kl.de   | r14
5812027Sjungma@eit.uni-kl.de   | r13
5912027Sjungma@eit.uni-kl.de   | r12	on startup === `only'
6012027Sjungma@eit.uni-kl.de   | r11	on startup === `userf'
6112027Sjungma@eit.uni-kl.de   | r10	on startup === `qt'
6212027Sjungma@eit.uni-kl.de   | r9		on startup === `qu'
6312027Sjungma@eit.uni-kl.de   | r26	on startup === qt_start		<--- qt.sp
6412027Sjungma@eit.uni-kl.de   +---
6512027Sjungma@eit.uni-kl.de
6612027Sjungma@eit.uni-kl.de   Conventions for varargs startup:
6712027Sjungma@eit.uni-kl.de
6812027Sjungma@eit.uni-kl.de   |  :
6912027Sjungma@eit.uni-kl.de   | arg6
7012027Sjungma@eit.uni-kl.de   | iarg5
7112027Sjungma@eit.uni-kl.de   |  :
7212027Sjungma@eit.uni-kl.de   | iarg0
7312027Sjungma@eit.uni-kl.de   | farg5
7412027Sjungma@eit.uni-kl.de   |  :
7512027Sjungma@eit.uni-kl.de   | farg0
7612027Sjungma@eit.uni-kl.de   +---
7712027Sjungma@eit.uni-kl.de   | padding
7812027Sjungma@eit.uni-kl.de   | r29
7912027Sjungma@eit.uni-kl.de   | r15
8012027Sjungma@eit.uni-kl.de   | r14
8112027Sjungma@eit.uni-kl.de   | r13
8212027Sjungma@eit.uni-kl.de   | r12	on startup === `startup'
8312027Sjungma@eit.uni-kl.de   | r11	on startup === `vuserf'
8412027Sjungma@eit.uni-kl.de   | r10	on startup === `cleanup'
8512027Sjungma@eit.uni-kl.de   | r9		on startup === `qt'
8612027Sjungma@eit.uni-kl.de   | r26	on startup === qt_vstart	<--- qt.sp
8712027Sjungma@eit.uni-kl.de   +---
8812027Sjungma@eit.uni-kl.de
8912027Sjungma@eit.uni-kl.de   Note: this is a pretty cheap/sleazy way to get things going,
9012027Sjungma@eit.uni-kl.de   but ``there must be a better way.''  For instance, some varargs
9112027Sjungma@eit.uni-kl.de   parameters could be loaded in to integer registers, or the return
9212027Sjungma@eit.uni-kl.de   address could be stored on top of the stack. */
9312027Sjungma@eit.uni-kl.de
9412027Sjungma@eit.uni-kl.de
9512027Sjungma@eit.uni-kl.de/* Stack must be 16-byte aligned. */
9612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKALIGN	(16)
9712027Sjungma@eit.uni-kl.de
9812027Sjungma@eit.uni-kl.de/* How much space is allocated to hold all the crud for
9912027Sjungma@eit.uni-kl.de   initialization: 7 registers times 8 bytes/register. */
10012027Sjungma@eit.uni-kl.de
10112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKBASE	(10 * 8)
10212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTKBASE	QUICKTHREADS_STKBASE
10312027Sjungma@eit.uni-kl.de
10412027Sjungma@eit.uni-kl.de
10512027Sjungma@eit.uni-kl.de/* Offsets of various registers. */
10612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_R26	0
10712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_R9	1
10812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_R10	2
10912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_R11	3
11012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_R12	4
11112027Sjungma@eit.uni-kl.de
11212027Sjungma@eit.uni-kl.de
11312027Sjungma@eit.uni-kl.de/* When a never-before-run thread is restored, the return pc points
11412027Sjungma@eit.uni-kl.de   to a fragment of code that starts the thread running.  For
11512027Sjungma@eit.uni-kl.de   non-vargs functions, it just calls the client's `only' function.
11612027Sjungma@eit.uni-kl.de   For varargs functions, it calls the startup, user, and cleanup
11712027Sjungma@eit.uni-kl.de   functions.
11812027Sjungma@eit.uni-kl.de
11912027Sjungma@eit.uni-kl.de   The varargs startup routine always reads 12 8-byte arguments from
12012027Sjungma@eit.uni-kl.de   the stack.  If fewer argumets were pushed, the startup routine
12112027Sjungma@eit.uni-kl.de   would read off the top of the stack.  To prevent errors we always
12212027Sjungma@eit.uni-kl.de   allocate enough space.  When there are fewer args, the preallocated
12312027Sjungma@eit.uni-kl.de   words are simply wasted. */
12412027Sjungma@eit.uni-kl.de
12512027Sjungma@eit.uni-kl.deextern void qt_start(void);
12612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGS_MD(sp)	(QUICKTHREADS_SPUT (sp, QUICKTHREADS_R26, qt_start))
12712027Sjungma@eit.uni-kl.de
12812027Sjungma@eit.uni-kl.de
12912027Sjungma@eit.uni-kl.de/* The AXP uses a struct for `va_list', so pass a pointer to the
13012027Sjungma@eit.uni-kl.de   struct.  This may break some uses of `QUICKTHREADS_VARGS', but then we never
13112027Sjungma@eit.uni-kl.de   claimed it was totally portable. */
13212027Sjungma@eit.uni-kl.de
13312027Sjungma@eit.uni-kl.detypedef void (qt_function_t)(void);
13412027Sjungma@eit.uni-kl.de
13512027Sjungma@eit.uni-kl.destruct qt_t;
13612027Sjungma@eit.uni-kl.destruct va_list;
13712027Sjungma@eit.uni-kl.deextern struct qt_t *qt_vargs (struct qt_t *sp, int nbytes,
13812027Sjungma@eit.uni-kl.de			      struct va_list *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, (struct va_list *)(&(vargs)), pt, \
14512027Sjungma@eit.uni-kl.de	     (qt_function_t *) startup, (qt_function_t *)vuserf, \
14612027Sjungma@eit.uni-kl.de	     (qt_function_t *)cleanup));
14712027Sjungma@eit.uni-kl.de
14812027Sjungma@eit.uni-kl.de
14912027Sjungma@eit.uni-kl.de/* The *index* (positive offset) of where to put each value. */
15012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ONLY_INDEX	(QUICKTHREADS_R12)
15112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_USER_INDEX	(QUICKTHREADS_R11)
15212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGT_INDEX	(QUICKTHREADS_R10)
15312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGU_INDEX	(QUICKTHREADS_R9)
15412027Sjungma@eit.uni-kl.de
15512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VCLEANUP_INDEX	(QUICKTHREADS_R10)
15612027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VUSERF_INDEX		(QUICKTHREADS_R11)
15712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTARTUP_INDEX	(QUICKTHREADS_R12)
15812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGT_INDEX		(QUICKTHREADS_R9)
15912027Sjungma@eit.uni-kl.de
16012027Sjungma@eit.uni-kl.de#endif /* ndef QUICKTHREADS_AXP_H */
161