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