/* * Copyright 1993,1994,1995 Emin Gun Sirer * MIPSI - Mips Instruction Set Simulator. */ /* Return the real address associated with the simulated virtual address. */ extern host_addr mem_address(mem_addr addr, c_rw rw) { Segment s; unsigned long diff; redo: /* * we do the range comparison by an unsigned subtraction */ s = segment[(addr >> 28)]; diff = addr - s.base; /* printf("s.segment = %lx + diff = 0x%x ==> 0x%lx\n", s.segment, diff, ((char *)s.segment + diff)); */ if(diff <= s.size) return (host_addr) ((char *)s.segment + diff); /* * expand stack if necessary -- segment[8] is always a stack segment * if the pointer is within a meg of sp, increase sp. */ if((segment[8].base - addr) < (1 * M)) { expand_stack(); goto redo; } /* we have to set Cause and BadVAddr */ BadVAddr = addr; /* * Let's seg fault right here */ *(char *)0 = '\0'; }