diff --git a/code/userprog/addrspace.cc b/code/userprog/addrspace.cc index fd155a4..7eca092 100644 --- a/code/userprog/addrspace.cc +++ b/code/userprog/addrspace.cc @@ -113,17 +113,37 @@ AddrSpace::AddrSpace (OpenFile * executable) { DEBUG ('a', "Initializing code segment, at 0x%x, size 0x%x\n", noffH.code.virtualAddr, noffH.code.size); - executable->ReadAt (&(machine->mainMemory[noffH.code.virtualAddr]), - noffH.code.size, noffH.code.inFileAddr); + #ifdef CHANGED + ReadAtVirtual( + executable, + noffH.code.virtualAddr, + noffH.code.size, + noffH.code.inFileAddr, + pageTable, + numPages + ); + #endif + // executable->ReadAt (&(machine->mainMemory[noffH.code.virtualAddr]), + // noffH.code.size, noffH.code.inFileAddr); } if (noffH.initData.size > 0) { DEBUG ('a', "Initializing data segment, at 0x%x, size 0x%x\n", noffH.initData.virtualAddr, noffH.initData.size); - executable->ReadAt (& - (machine->mainMemory - [noffH.initData.virtualAddr]), - noffH.initData.size, noffH.initData.inFileAddr); + #ifdef CHANGED + ReadAtVirtual( + executable, + noffH.initData.virtualAddr, + noffH.initData.size, + noffH.initData.inFileAddr, + pageTable, + numPages + ); + #endif + // executable->ReadAt (& + // (machine->mainMemory + // [noffH.initData.virtualAddr]), + // noffH.initData.size, noffH.initData.inFileAddr); } DEBUG ('a', "Area for stacks at 0x%x, size 0x%x\n", @@ -348,4 +368,28 @@ AddrSpace::DeAllocateUserStack(int addr){ memoryMap->Clear(bit); semAllocateUserStack->V(); } + +void +AddrSpace::ReadAtVirtual(OpenFile *executable, + int virtualaddr, int numBytes, int position, TranslationEntry *pageTable, unsigned int numPages) { + + DEBUG('a',"ReadAtVirtual\n"); + char buffer[numBytes]; + int size = executable->ReadAt(&buffer, numBytes, position); + + // Backup current page table + TranslationEntry *oldPageTable = machine->currentPageTable; + machine->currentPageTable = pageTable; + int oldPageTableSize = machine->currentPageTableSize; + machine->currentPageTableSize = numPages; + + // Copy bytes from out buffet to our page + int i; + for(i=0;iWriteMem(virtualaddr+i, 1, *(buffer+i)); + } + // Get back our old page table + machine->currentPageTable = oldPageTable; + machine->currentPageTableSize = oldPageTableSize; +} #endif diff --git a/code/userprog/addrspace.h b/code/userprog/addrspace.h index ea68b64..7398143 100644 --- a/code/userprog/addrspace.h +++ b/code/userprog/addrspace.h @@ -54,12 +54,18 @@ class AddrSpace:public dontcopythis BitMap * memoryMap; int AllocateUserStack(); void DeAllocateUserStack(int addr); + + #endif private: NoffHeader noffH; // Program layout TranslationEntry * pageTable; // Page table unsigned int numPages; // Number of pages in the page table + #ifdef CHANGED + static void ReadAtVirtual(OpenFile *executable, + int virtualaddr, int numBytes, int position, TranslationEntry *pageTable, unsigned int numPages); + #endif //CHANGED }; extern List AddrspaceList;