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