vax.h

来自「system C源码 一种替代verilog的语言」· C头文件 代码 · 共 131 行

H
131
字号
/* * QuickThreads -- Threads-building toolkit. * Copyright (c) 1993 by David Keppel * * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby * granted, provided that the above copyright notice and this notice * appear in all copies.  This software is provided as a * proof-of-concept and for demonstration purposes; there is no * representation about the suitability of this software for any * purpose. */#ifndef QUICKTHREADS_VAX_H#define QUICKTHREADS_VAX_Htypedef unsigned long qt_word_t;/* Thread's initial stack layout on the VAX:   non-varargs:   +---   | arg[2]	=== `userf' on startup   | arg[1]	=== `pt' on startup   | arg[0]	=== `pu' on startup   | ...	=== `only' on startup.   +---   | ret pc	=== `qt_start' on startup   | fp		=== 0 on startup   | ap		=== 0 on startup   | <mask>   | 0 (handler)			<--- qt_t.sp   +---   When a non-varargs thread is started, it ``returns'' to the start   routine, which calls the client's `only' function.   The varargs case is clearly bad code.  The various values should be   stored in a save area and snarfed in to callee-save registers on   startup.  However, it's too painful to figure out the register   mask (right now), so do it the slow way.   +---   | arg[n-1]   | ..   | arg[0]   | nargs   +---   |		=== `cleanup'   |		=== `vuserf'   |		=== `startup'   |		=== `pt'   +---   | ret pc	=== `qt_start' on startup   | fp		=== 0 on startup   | ap		=== 0 on startup   | <mask>   | 0 (handler)			<--- qt_t.sp   +---   When a varargs thread is started, it ``returns'' to the `qt_vstart'   startup code.  The startup code pops all the extra arguments, then   calls the appropriate functions. *//* What to do to start a thread running. */extern void qt_start (void);extern void qt_vstart (void);/* Initial call frame for non-varargs and varargs cases. */#define QUICKTHREADS_STKBASE	(10 * 4)#define QUICKTHREADS_VSTKBASE	(9 * 4)/* Stack "must be" 4-byte aligned.  (Actually, no, but it's   easiest and probably fastest to do so.) */#define QUICKTHREADS_STKALIGN	(4)/* Where to place various arguments. */#define QUICKTHREADS_ONLY_INDEX	(5)#define QUICKTHREADS_USER_INDEX	(8)#define QUICKTHREADS_ARGT_INDEX	(7)#define QUICKTHREADS_ARGU_INDEX	(6)#define QUICKTHREADS_VSTARTUP_INDEX	(6)#define QUICKTHREADS_VUSERF_INDEX		(7)#define QUICKTHREADS_VCLEANUP_INDEX	(8)#define QUICKTHREADS_VARGT_INDEX		(5)/* Stack grows down.  The top of the stack is the first thing to   pop off (predecrement, postincrement). */#define QUICKTHREADS_GROW_DOWNextern void qt_error (void);#define QUICKTHREADS_VAX_GMASK_NOREGS	(0)/* Push on the error return address, null termination to call chains,   number of arguments to `only', register save mask (save no   registers). */#define QUICKTHREADS_ARGS_MD(sto) \    (QUICKTHREADS_SPUT (sto, 0, 0), \     QUICKTHREADS_SPUT (sto, 1, QUICKTHREADS_VAX_GMASK_NOREGS), \     QUICKTHREADS_SPUT (sto, 2, 0), \     QUICKTHREADS_SPUT (sto, 3, 0), \     QUICKTHREADS_SPUT (sto, 4, qt_start))#define QUICKTHREADS_VARGS_MD0(sto, nbytes) \    (QUICKTHREADS_SPUT (sto, (-(nbytes)/4)-1, (nbytes)/4), \     ((char *)(((sto)-4) - QUICKTHREADS_STKROUNDUP(nbytes))))#define QUICKTHREADS_VARGS_ADJUST(sp)	((char *)sp + 4)#define QUICKTHREADS_VARGS_MD1(sto) \    (QUICKTHREADS_SPUT (sto, 0, 0), \     QUICKTHREADS_SPUT (sto, 1, QUICKTHREADS_VAX_GMASK_NOREGS), \     QUICKTHREADS_SPUT (sto, 2, 0), \     QUICKTHREADS_SPUT (sto, 3, 0), \     QUICKTHREADS_SPUT (sto, 4, qt_vstart))#define QUICKTHREADS_VARGS_DEFAULT#endif /* QUICKTHREADS_VAX_H */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?