From e2c774f65c5117bafebd826233791b730f084a50 Mon Sep 17 00:00:00 2001 From: Travis Geiselbrecht Date: Mon, 26 May 2008 08:17:56 +0000 Subject: [PATCH] fix a bug in the elf loader/mmu stuff in the bootloader that would cause the mmu code to reuse a page that was just about to get mapped. git-svn-id: svn+ssh://newos.org/var/svn/newos/newos@1251 c25cc9d1-44fa-0310-b259-ad778cb1d433 --- boot/pc/x86_64/mmu.c | 5 +++++ boot/pc/x86_64/stage2.c | 29 ++++++++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/boot/pc/x86_64/mmu.c b/boot/pc/x86_64/mmu.c index 1ca9dff..032901f 100755 --- a/boot/pc/x86_64/mmu.c +++ b/boot/pc/x86_64/mmu.c @@ -44,6 +44,8 @@ static unsigned long *alloc_pagetable(kernel_args *ka) for(i = 0; i < 512; i++) table[i] = 0; +// dprintf("alloc_pagetable returning %p\n", table); + return table; } @@ -97,6 +99,7 @@ static unsigned long *lookup_pgtable_entry(addr_t vaddr) pgtable = alloc_pagetable(ka); *ent = (addr_t)pgtable | DEFAULT_PAGE_FLAGS; } else { +// dprintf("existing ent 0x%lx\n", *ent); pgtable = (unsigned long *)PGENT_TO_ADDR(*ent); } // dprintf("pgtable_addr 0 %p\n", pgtable); @@ -106,6 +109,7 @@ static unsigned long *lookup_pgtable_entry(addr_t vaddr) pgtable = alloc_pagetable(ka); *ent = (addr_t)pgtable | DEFAULT_PAGE_FLAGS; } else { +// dprintf("existing ent 0x%lx\n", *ent); pgtable = (unsigned long *)PGENT_TO_ADDR(*ent); } // dprintf("pgtable_addr 1 %p\n", pgtable); @@ -115,6 +119,7 @@ static unsigned long *lookup_pgtable_entry(addr_t vaddr) pgtable = alloc_pagetable(ka); *ent = (addr_t)pgtable | DEFAULT_PAGE_FLAGS; } else { +// dprintf("existing ent 0x%lx\n", *ent); pgtable = (unsigned long *)PGENT_TO_ADDR(*ent); } // dprintf("pgtable_addr 2 %p\n", pgtable); diff --git a/boot/pc/x86_64/stage2.c b/boot/pc/x86_64/stage2.c index 62331d1..2978fa1 100644 --- a/boot/pc/x86_64/stage2.c +++ b/boot/pc/x86_64/stage2.c @@ -140,9 +140,11 @@ void stage2_main(void *multiboot_info, unsigned int memsize, void *extended_mem_ // map in a kernel stack ka->cpu_kstack[0].start = next_vaddr; for (i=0; icpu_kstack[0].size = next_vaddr - ka->cpu_kstack[0].start; @@ -358,34 +360,39 @@ static void load_elf_image(void *data, addr_range *ar0, addr_range *ar1, addr_t continue; } - dprintf("segment %d\n", segmentIndex); - dprintf("p_vaddr 0x%lx p_paddr 0x%lx p_filesz 0x%lx p_memsz 0x%lx\n", - segment->p_vaddr, segment->p_paddr, segment->p_filesz, segment->p_memsz); +// dprintf("segment %d\n", segmentIndex); +// dprintf("p_vaddr 0x%lx p_paddr 0x%lx p_filesz 0x%lx p_memsz 0x%lx\n", +// segment->p_vaddr, segment->p_paddr, segment->p_filesz, segment->p_memsz); /* Map initialized portion */ for (segmentOffset = 0; segmentOffset < ROUNDUP(segment->p_filesz, PAGE_SIZE); segmentOffset += PAGE_SIZE) { - mmu_map_page(segment->p_vaddr + segmentOffset, next_paddr); + addr_t paddr = next_paddr; + next_paddr += PAGE_SIZE; + + mmu_map_page(segment->p_vaddr + segmentOffset, paddr); memcpy((void *)ROUNDOWN(segment->p_vaddr + segmentOffset, PAGE_SIZE), (void *)ROUNDOWN((addr_t)data + segment->p_offset + segmentOffset, PAGE_SIZE), PAGE_SIZE); - next_paddr += PAGE_SIZE; } /* Clean out the leftover part of the last page */ if(segment->p_filesz % PAGE_SIZE > 0) { - dprintf("memsetting 0 to va 0x%lx, size %d\n", (void*)(segment->p_vaddr + segment->p_filesz), PAGE_SIZE - (segment->p_filesz % PAGE_SIZE)); +// dprintf("memsetting 0 to va 0x%lx, size %d\n", (void*)(segment->p_vaddr + segment->p_filesz), PAGE_SIZE - (segment->p_filesz % PAGE_SIZE)); memset((void*)(segment->p_vaddr + segment->p_filesz), 0, PAGE_SIZE - (segment->p_filesz % PAGE_SIZE)); } /* Map uninitialized portion */ for (; segmentOffset < ROUNDUP(segment->p_memsz, PAGE_SIZE); segmentOffset += PAGE_SIZE) { - dprintf("mapping zero page at va 0x%lx\n", segment->p_vaddr + segmentOffset); - mmu_map_page(segment->p_vaddr + segmentOffset, next_paddr); - memset((void *)(segment->p_vaddr + segmentOffset), 0, PAGE_SIZE); +// dprintf("mapping zero page at va 0x%lx\n", segment->p_vaddr + segmentOffset); + + addr_t paddr = next_paddr; next_paddr += PAGE_SIZE; + + mmu_map_page(segment->p_vaddr + segmentOffset, paddr); + memset((void *)(segment->p_vaddr + segmentOffset), 0, PAGE_SIZE); } switch(foundSegmentIndex) { case 0: -- 2.11.4.GIT