/* * Copyright 1993,1994,1995 Emin Gun Sirer * MIPSI - Mips Instruction Set Simulator. */ #include #include #include "config.h" #include "main.h" #include "mem.h" #include "tlb.h" #include "mt_vm.h" #define STACKSZ 256 * K #define STACKDELTA 256 * K Segment segment[9]; /* define the externs in mem.h */ mem_word *textseg, *dataseg, *stackseg; unsigned long textsize, datasize, stacksize; mem_addr pbreak, pstaddress; /* we use the inlined macro otherwise */ #include "memaddr.c" /* * this is to allow passing NULL pointers in system calls without causing * illegal address traps and translating non-null pointers. Can replace * mem_address for "VAX bug compatibility" :-). */ extern host_addr mem_address_nullok(mem_addr addr,c_rw rw) { Segment s; unsigned long diff; if(addr == 0) return 0; return mem_address(addr,rw); } static void setsegtype(mem_addr base, unsigned long size, Id id) { int seg; for(seg = base >> 28; seg <= ((base + size) >> 28); ++seg) { segment[seg].segmentid = id; segment[seg].base = base; segment[seg].size = size; } } static void updatesegmentmap(void) { setsegtype(TEXT_START, textsize, Text); setsegtype(DATA_START, datasize, Data); setsegtype(STACK_END-stacksize, stacksize, Stack); } extern void make_memory(unsigned long textsz, unsigned long datasz) { textsize = ROUND(textsz,PAGESIZE); datasize = ROUND(datasz,PAGESIZE); stacksize = ROUND(STACKSZ,PAGESIZE); mt_vm_initialize(TEXT_START,TEXT_START + textsize, STACK_END - MAX_MEMORY_SIZE, STACK_END, DATA_START, DATA_START + MAX_MEMORY_SIZE); updatesegmentmap(); } extern void free_memory(void) { } /* Expand the data segment by delta */ extern void expand_data(long delta) { unsigned long oldsize = datasize; datasize += delta; updatesegmentmap(); } /* Expand the stack segment */ void expand_stack(void) { int oldsize = stacksize; stacksize += STACKDELTA; updatesegmentmap(); } void print_memstats(void) { int i; printf("Text space used 0x%x\n", segment[0].size); printf("Data space used 0x%x\n", segment[1].size); printf("Max stack space 0x%x\n", segment[8].size); }