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