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_SPARC_H
1512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_SPARC_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/* Stack layout on the sparc:
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   | <blank space for alignment>
2512027Sjungma@eit.uni-kl.de   | %o7 == return address -> qt_start
2612027Sjungma@eit.uni-kl.de   | %i7
2712027Sjungma@eit.uni-kl.de   | %i6 == frame pointer -> 0 (NULL-terminated stack frame chain)
2812027Sjungma@eit.uni-kl.de   | %i5 -> only
2912027Sjungma@eit.uni-kl.de   | %i4 -> userf
3012027Sjungma@eit.uni-kl.de   | %i3
3112027Sjungma@eit.uni-kl.de   | %i2 -> pt
3212027Sjungma@eit.uni-kl.de   | %i1 -> pu
3312027Sjungma@eit.uni-kl.de   | %i0
3412027Sjungma@eit.uni-kl.de   | %l7
3512027Sjungma@eit.uni-kl.de   | %l6
3612027Sjungma@eit.uni-kl.de   | %l5
3712027Sjungma@eit.uni-kl.de   | %l4
3812027Sjungma@eit.uni-kl.de   | %l3
3912027Sjungma@eit.uni-kl.de   | %l2
4012027Sjungma@eit.uni-kl.de   | %l1
4112027Sjungma@eit.uni-kl.de   | %l0	<--- qt_t.sp
4212027Sjungma@eit.uni-kl.de   +---
4312027Sjungma@eit.uni-kl.de
4412027Sjungma@eit.uni-kl.de   varargs:
4512027Sjungma@eit.uni-kl.de
4612027Sjungma@eit.uni-kl.de   |  :
4712027Sjungma@eit.uni-kl.de   |  :
4812027Sjungma@eit.uni-kl.de   | argument list
4912027Sjungma@eit.uni-kl.de   | one-word aggregate return pointer
5012027Sjungma@eit.uni-kl.de   +---
5112027Sjungma@eit.uni-kl.de   | <blank space for alignment>
5212027Sjungma@eit.uni-kl.de   | %o7 == return address -> qt_vstart
5312027Sjungma@eit.uni-kl.de   | %i7
5412027Sjungma@eit.uni-kl.de   | %i6 == frame pointer -> 0 (NULL-terminated stack frame chain)
5512027Sjungma@eit.uni-kl.de   | %i5 -> startup
5612027Sjungma@eit.uni-kl.de   | %i4 -> userf
5712027Sjungma@eit.uni-kl.de   | %i3 -> cleanup
5812027Sjungma@eit.uni-kl.de   | %i2 -> pt
5912027Sjungma@eit.uni-kl.de   | %i1
6012027Sjungma@eit.uni-kl.de   | %i0
6112027Sjungma@eit.uni-kl.de   | %l7
6212027Sjungma@eit.uni-kl.de   | %l6
6312027Sjungma@eit.uni-kl.de   | %l5
6412027Sjungma@eit.uni-kl.de   | %l4
6512027Sjungma@eit.uni-kl.de   | %l3
6612027Sjungma@eit.uni-kl.de   | %l2
6712027Sjungma@eit.uni-kl.de   | %l1
6812027Sjungma@eit.uni-kl.de   | %l0	<--- qt_t.sp
6912027Sjungma@eit.uni-kl.de   +---
7012027Sjungma@eit.uni-kl.de
7112027Sjungma@eit.uni-kl.de   */
7212027Sjungma@eit.uni-kl.de
7312027Sjungma@eit.uni-kl.de
7412027Sjungma@eit.uni-kl.de/* What to do to start a thread running. */
7512027Sjungma@eit.uni-kl.deextern void qt_start (void);
7612027Sjungma@eit.uni-kl.deextern void qt_vstart (void);
7712027Sjungma@eit.uni-kl.de
7812027Sjungma@eit.uni-kl.de
7912027Sjungma@eit.uni-kl.de/* Hold 17 saved registers + 1 word for alignment. */
8012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKBASE	(18 * 4)
8112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTKBASE	QUICKTHREADS_STKBASE
8212027Sjungma@eit.uni-kl.de
8312027Sjungma@eit.uni-kl.de
8412027Sjungma@eit.uni-kl.de/* Stack must be doubleword aligned. */
8512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKALIGN	(8)	/* Doubleword aligned. */
8612027Sjungma@eit.uni-kl.de
8712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ONLY_INDEX	(QUICKTHREADS_I5)
8812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_USER_INDEX	(QUICKTHREADS_I4)
8912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGT_INDEX	(QUICKTHREADS_I2)
9012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGU_INDEX	(QUICKTHREADS_I1)
9112027Sjungma@eit.uni-kl.de
9212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTARTUP_INDEX	(QUICKTHREADS_I5)
9312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VUSERF_INDEX		(QUICKTHREADS_I4)
9412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VCLEANUP_INDEX	(QUICKTHREADS_I3)
9512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGT_INDEX		(QUICKTHREADS_I2)
9612027Sjungma@eit.uni-kl.de
9712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_O7	(16)
9812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_I6	(14)
9912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_I5	(13)
10012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_I4	(12)
10112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_I3	(11)
10212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_I2	(10)
10312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_I1	( 9)
10412027Sjungma@eit.uni-kl.de
10512027Sjungma@eit.uni-kl.de
10612027Sjungma@eit.uni-kl.de/* The thread will ``return'' to the `qt_start' routine to get things
10712027Sjungma@eit.uni-kl.de   going.  The normal return sequence takes us to QUICKTHREADS_O7+8, so we
10812027Sjungma@eit.uni-kl.de   pre-subtract 8.  The frame pointer chain is 0-terminated to prevent
10912027Sjungma@eit.uni-kl.de   the trap handler from chasing off in to random memory when flushing
11012027Sjungma@eit.uni-kl.de   stack windows. */
11112027Sjungma@eit.uni-kl.de
11212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGS_MD(top) \
11312027Sjungma@eit.uni-kl.de    (QUICKTHREADS_SPUT ((top), QUICKTHREADS_O7, ((void *)(((int)qt_start)-8))), \
11412027Sjungma@eit.uni-kl.de     QUICKTHREADS_SPUT ((top), QUICKTHREADS_I6, 0))
11512027Sjungma@eit.uni-kl.de
11612027Sjungma@eit.uni-kl.de
11712027Sjungma@eit.uni-kl.de/* The varargs startup routine always reads 6 words of arguments
11812027Sjungma@eit.uni-kl.de   (6 argument registers) from the stack, offset by one word to
11912027Sjungma@eit.uni-kl.de   allow for an aggregate return area  pointer.  If the varargs
12012027Sjungma@eit.uni-kl.de   routine actually pushed fewer words than that, qt_vstart could read
12112027Sjungma@eit.uni-kl.de   off the top of the stack.  To prevent errors, we always allocate 8
12212027Sjungma@eit.uni-kl.de   words.  The space is often just wasted. */
12312027Sjungma@eit.uni-kl.de
12412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD0(sp, vabytes) \
12512027Sjungma@eit.uni-kl.de  ((qt_t *)(((char *)(sp)) - 8*4 - QUICKTHREADS_STKROUNDUP(vabytes)))
12612027Sjungma@eit.uni-kl.de
12712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD1(sp) \
12812027Sjungma@eit.uni-kl.de  (QUICKTHREADS_SPUT (sp, QUICKTHREADS_O7, ((void *)(((int)qt_vstart)-8))))
12912027Sjungma@eit.uni-kl.de
13012027Sjungma@eit.uni-kl.de/* The SPARC has wierdo calling conventions which stores a hidden
13112027Sjungma@eit.uni-kl.de   parameter for returning aggregate values, so the rest of the
13212027Sjungma@eit.uni-kl.de   parameters are shoved up the stack by one place. */
13312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_ADJUST(sp)	(((char *)sp)+4)
13412027Sjungma@eit.uni-kl.de
13512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_DEFAULT
13612027Sjungma@eit.uni-kl.de
13712027Sjungma@eit.uni-kl.de
13812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_GROW_DOWN
13912027Sjungma@eit.uni-kl.de
14012027Sjungma@eit.uni-kl.de#endif /* ndef QUICKTHREADS_SPARC_H */
141