Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "base/system.h"
- uint32_t currentSize = 0;
- using namespace std;
- void Kernel::syscall(int num, uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3)
- {
- uint32_t newSize = arg0;
- uint32_t heapStart = userModeHeap.base;
- //om new-size(arg0) är mindre
- if(newSize < currentSize ) {
- for (uint32_t i = heapStart + currentSize; i >= heapStart + newSize; i-=4096) {
- /* "ta bort pages" */
- freeFrame(mmu.cr3.tables[i>>22]->entries[(i>>12)&0x3ff].frame);
- mmu.cr3.tables[i>>22]->entries[(i>>12)&0x3ff].present = false;
- mmu.cr3.tables[i>>22]->entries[(i>>12)&0x3ff].frame = 0;
- }
- currentSize = newSize;
- }
- //om new-size(arg0) är större
- else if(newSize > currentSize) {
- for (uint32_t i = currentSize; i < heapStart + newSize; i+=4096) {
- //skapar pagetable vid pagedir
- if(mmu.cr3.tables[i>>22] == NULL){
- mmu.cr3.tables[i>>22] = new PageTable();
- cout << "New PageTable created" << endl;
- }
- /* "lägg till pages" */
- //cout<<"A1"<<endl;
- mmu.cr3.tables[i>>22]->entries[(i>>12)&0x3ff].present = true;
- mmu.cr3.tables[i>>22]->entries[(i>>12)&0x3ff].frame = allocateFrame();
- //cout<<"A2"<<endl;
- }
- currentSize = newSize;
- }
- printf("output: syscall %d arg0=%08x arg1=%08x arg2=%08x arg3=%08x\n", num, arg0, arg1, arg2, arg3);
- switch(num) {
- case SYS_BRK:
- std::cout << "Brk is not implemented" << std::endl;
- return;
- default:
- std::cout << "Unrecognised syscall: " << num << std::endl;
- return;
- }
- }
- void Kernel::pageFaultHandler(uint32_t vaddr)
- {
- printf("output: Page fault! addr=%08x\n",vaddr);
- throw std::string("output: Program segv");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement