# HG changeset patch # User John Tsiombikas # Date 1320461626 -7200 # Node ID 0fe6eef163352f7e1bac1de9a6fbb0b5bdc54bd1 # Parent 8b21fe04ba2c4d48007d77d41b6e1a3f3897daf7 holy fuck, copy_on_write didn't actually do the copy!!!! diff -r 8b21fe04ba2c -r 0fe6eef16335 src/main.c --- a/src/main.c Sat Oct 15 08:07:09 2011 +0300 +++ b/src/main.c Sat Nov 05 04:53:46 2011 +0200 @@ -5,6 +5,7 @@ #include "asmops.h" #include "segm.h" #include "intr.h" +#include "ata.h" #include "rtc.h" #include "timer.h" #include "mem.h" @@ -35,6 +36,9 @@ /* initialize paging and the virtual memory manager */ init_vm(); + /* initialize ATA disks */ + init_ata(); + /* initialize the timer and RTC */ init_timer(); init_rtc(); diff -r 8b21fe04ba2c -r 0fe6eef16335 src/vm.c --- a/src/vm.c Sat Oct 15 08:07:09 2011 +0300 +++ b/src/vm.c Sat Nov 05 04:53:46 2011 +0200 @@ -93,7 +93,7 @@ pglist[MEM_USER]->end = kmem_start_pg; pglist[MEM_USER]->next = 0; - /* temporaroly map something into every 1024th page of the kernel address + /* temporarily map something into every 1024th page of the kernel address * space to force pre-allocation of all the kernel page-tables */ for(i=kmem_start_pg; ivpage = page->vpage; newpage->flags = page->flags; - if(!(newphys = alloc_phys_page())) { + if(!(tmpvpg = pgalloc(1, MEM_KERNEL))) { printf("copy_on_write: failed to allocate physical page\n"); /* XXX proper action: SIGSEGV */ return -1; } - newpage->ppage = ADDR_TO_PAGE(newphys); + newpage->ppage = virt_to_phys_page(tmpvpg); newpage->nref = 1; + /* do the copy */ + memcpy((void*)PAGE_TO_ADDR(tmpvpg), (void*)PAGE_TO_ADDR(page->vpage), PGSIZE); + unmap_page(tmpvpg); + pgfree(tmpvpg, 1); + /* set the new vm_page in the process vmmap */ vmnode = rb_findi(&p->vmmap, newpage->vpage); assert(vmnode && vmnode->data == page); /* shouldn't be able to fail */