/*ident "@(#)cls4:lib/task/task/hw_stack.h 1.5" */ /******************************************************************************* C++ source for the C++ Language System, Release 3.0. This product is a new release of the original cfront developed in the computer science research center of AT&T Bell Laboratories. Copyright (c) 1993 UNIX System Laboratories, Inc. Copyright (c) 1991, 1992 AT&T and UNIX System Laboratories, Inc. Copyright (c) 1984, 1989, 1990 AT&T. All Rights Reserved. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE of AT&T and UNIX System Laboratories, Inc. The copyright notice above does not evidence any actual or intended publication of such source code. *******************************************************************************/ #ifndef HW_STACK_H #define HW_STACK_H /* Machine-dependent macros, typedefs, and externs for task library. * Porting these requires intimate knowledge of the stack frame layout, * call and return sequences for the machine. * They are used by task.c and fudge.c and sim.c. * * Some are grouped according to direction of stack growth. * * New-style asms would eliminate function calls for TOP, AP, and FP. */ typedef unsigned char MACHINE_BYTE; #define STACK_GROWS_DOWN /* typedefs for the hardware state saved on the stack after a call. * Assumes eax, ecx, edx are scratch registers, ebp is fp, esp is sp. */ typedef struct { unsigned long edi; unsigned long esi; unsigned long ebx; } HW_REGS; struct FrameLayout { int offset; // of base of saved registers from fp unsigned short mask; // of registers saved in frame FrameLayout(int*); // called with frame pointer }; extern int* Skip_pc_p; /* global for FUDGE_SP and fudge_sp */ extern "C" { extern int* FP(); /* FP of caller */ extern void FUDGE_SP(int*, int*); /* prepare to reset sp */ extern void fudge_sp(); /* reset sp on return through fudged * frame */ extern int* TOP(); /* SP of caller * (pnts to last used word in stack) */ } #define AP() 0 /* unnecessary on i386 */ #define OLD_AP(fp) 0 /* unnecessary on i386 */ #define OLD_FP(fp) (*((int*)(fp))) #define OLD_PC(fp) (*((int*)(fp) + 1)) #define OLD_PC_P(fp) ((int*)(fp) + 1) #define FIRST_SAVED_REG_P(fp, o) (((int*)(fp) - (o)) - 1) extern void save_saved_regs(HW_REGS*, int*); /* Save all current regs and regs saved in this frame in reg_struct_p, * for restoration when child runs. * Note: SAVE_REGS needed in case task::restore() saves more regs * than task::task. */ #define SAVE_CHILD_REGS(reg_struct_p) \ SAVE_REGS(reg_struct_p); \ save_saved_regs((reg_struct_p), ta_fp); extern "C" { extern void set_ebx(int*); extern void set_esi(int*); extern void set_edi(int*); } #define MAXINT_AS_FLOAT 2147483647.0 #endif /* HW_STACK_H */