/*-------------------------------------------------------------------------*/ /* Prolog To Wam Compiler INRIA Rocquencourt - CLoE Project */ /* C Run-time Daniel Diaz - 1994 */ /* */ /* Machine Dependent Features */ /* */ /* machine.c */ /*-------------------------------------------------------------------------*/ #include #include #include #include #include #include #define MACHINE_FILE #include "wam_engine.h" /*---------------------------------*/ /* Constants */ /*---------------------------------*/ /* Error Messages */ #define ERR_STACKS_ALLOCATION "Memory allocation fault" #define ERR_STACK_OVERFLOW "%s stack overflow (size: %d Kb, env. variable: %s)" #define ERR_CANNOT_OPEN_DEV0 "Cannot open /dev/zero : %s" #define ERR_CANNOT_UNMAP "unmap failed : %s" #define ERR_CANNOT_SHMGET "shmget failed : %s" #define ERR_CANNOT_SHMAT "shmat failed : %s" /*---------------------------------*/ /* Type Definitions */ /*---------------------------------*/ /*---------------------------------*/ /* Global Variables */ /*---------------------------------*/ #ifdef M_USE_MAGIC_NB_TO_DETECT_STACK_NAME static WamWord *check_adr[NB_OF_STACKS+1]; #endif #ifndef M_pc_linux_elf #if !defined(M_i386_freebsd) && !defined(M_alpha_freebsd) extern char *sys_errlist[]; #endif #endif /*---------------------------------*/ /* Function Prototypes */ /*---------------------------------*/ #ifdef M_USE_MAGIC_NB_TO_DETECT_STACK_NAME static void Fill_Magic_Adr_Table (void); #endif static void SIGSEGV_Handler (); static void Stack_Overflow (int stk_nb); #define Round_Up(x,y) M_Mul(M_Div(((x)+(y)-1),(y)),(y)) #define Round_Down(x,y) M_Mul(M_Div((x),(y)),(y)) #ifdef M_USE_MALLOC /*-------------------------------------------------------------------------*/ /* M_ALLOCATE_STACKS */ /* */ /*-------------------------------------------------------------------------*/ void M_Allocate_Stacks(void) { int len=0; WamWord *addr; int i; for(i=0;i /*-------------------------------------------------------------------------*/ /* M_ALLOCATE_STACKS */ /* */ /*-------------------------------------------------------------------------*/ void M_Allocate_Stacks(void) { int fd; int page_size; int len=0; WamWord *addr; int i; page_size=getpagesize()/sizeof(WamWord); #ifndef M_dec_alpha fd=open("/dev/zero",0); if (fd== -1) Fatal_Error(ERR_CANNOT_OPEN_DEV0,sys_errlist[errno]); #endif for(i=0;i #include #ifdef M_dec_ultrix #undef SHMLBA #define SHMLBA 0x400000 #endif /*-------------------------------------------------------------------------*/ /* M_ALLOCATE_STACKS */ /* */ /*-------------------------------------------------------------------------*/ void M_Allocate_Stacks(void) { int page_size; int seg_size; int len=0; WamWord *addr; int shmid,shmat_ret; int i; page_size=getpagesize()/sizeof(WamWord); seg_size =SHMLBA/sizeof(WamWord); for(i=0;isc_badvaddr); #elif defined(M_dec_alpha) WamWord *addr=(WamWord *) (scp->sc_traparg_a0); #endif int i; #ifdef CDEBUG printf("BAD ADDRESS:%x\n",addr); #endif for(i=NB_OF_STACKS;i-- >0;) { #ifdef CDEBUG printf("STACK[%d].stack + size: %x\n", i,stk_tbl[i].stack+stk_tbl[i].size); #endif if (addr>=stk_tbl[i].stack+stk_tbl[i].size) Stack_Overflow(i); } #endif Fatal_Error("Segmentation Violation"); } #ifdef M_USE_MAGIC_NB_TO_DETECT_STACK_NAME /*-------------------------------------------------------------------------*/ /* M_CHECK_MAGIC_WORDS */ /* */ /*-------------------------------------------------------------------------*/ void M_Check_Magic_Words(void) { WamWord **p=(WamWord **) check_adr; for(p=(WamWord **) check_adr;*p;p++) if (**p != M_MAGIC) Stack_Overflow(p-(WamWord **) check_adr); } #endif /*-------------------------------------------------------------------------*/ /* STACK_OVERFLOW */ /* */ /*-------------------------------------------------------------------------*/ static void Stack_Overflow(int stk_nb) { InfStack *s=stk_tbl+stk_nb; char *var=(*(s->env_var_name)) ? s->env_var_name : "none"; int size=s->size; if (s->stack==Global_Stack) s->size+=REG_BANK_SIZE; /*see Init_Wam_Engine */ Fatal_Error(ERR_STACK_OVERFLOW,s->name,Wam_Words_To_KBytes(s->size),var); } #ifdef M_SAVE_REGS_BEFORE_LIB_C_CALLS /*-------------------------------------------------------------------------*/ /* LIB_CALL */ /* */ /*-------------------------------------------------------------------------*/ int Lib_Call(int i0,int i1,int i2,int i3,int i4,int i5) { int res; WamWord buff_save_machine_regs[NB_OF_USED_MACHINE_REGS]; Save_Machine_Regs(buff_save_machine_regs) res=(* ((int (*)()) i0))(i1,i2,i3,i4,i5); Restore_Machine_Regs(buff_save_machine_regs) return res; } #endif