From 9a2cb452e521cb96220024807062f5b0a966c0a9 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 20 Dec 2014 00:47:07 +0100 Subject: [PATCH 1/5] fixes wrong return value of page_map(), fixes #2y Signed-off-by: Stefan Lankes --- arch/x86/mm/page.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/arch/x86/mm/page.c b/arch/x86/mm/page.c index 4432721..60c350d 100644 --- a/arch/x86/mm/page.c +++ b/arch/x86/mm/page.c @@ -129,6 +129,7 @@ int page_map(size_t viraddr, size_t phyaddr, size_t npages, size_t bits) } } + ret = 0; out: if (bits & PG_USER) spinlock_irqsave_unlock(¤t_task->page_lock); @@ -155,6 +156,7 @@ int page_unmap(size_t viraddr, size_t npages) spinlock_irqsave_unlock(¤t_task->page_lock); spinlock_unlock(&kslock); + /* This can't fail because we don't make checks here */ return 0; } @@ -179,7 +181,8 @@ int page_map_drop() traverse(PAGE_LEVELS-1, 0); spinlock_irqsave_unlock(¤t_task->page_lock); - + + /* This can't fail because we don't make checks here */ return 0; } @@ -223,8 +226,9 @@ int page_map_copy(task_t *dest) other[PAGE_LEVELS-1][PAGE_MAP_ENTRIES-1] = dest->page_map | PG_PRESENT | PG_SELF | PG_RW; self [PAGE_LEVELS-1][PAGE_MAP_ENTRIES-2] = 0; spinlock_irqsave_unlock(¤t_task->page_lock); - - flush_tlb(); /* Flush TLB entries of 'other' self-reference */ + + /* Flush TLB entries of 'other' self-reference */ + flush_tlb(); return ret; } From 239ee0c0519d71b004906a31943bbf33d3c04091 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Sat, 27 Dec 2014 23:20:45 +0100 Subject: [PATCH 2/5] fix wrong initialization of CR4 --- arch/x86/kernel/entry.asm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/entry.asm b/arch/x86/kernel/entry.asm index 93e7d11..1901428 100644 --- a/arch/x86/kernel/entry.asm +++ b/arch/x86/kernel/entry.asm @@ -82,9 +82,9 @@ cpu_init: mov cr3, eax ; Set CR4 - mov cr4, eax - and eax, ~(1 << 9) ; disable SSE - or eax, (1 << 4) ; enable PSE + mov eax, cr4 + and eax, 0xfffbf9ff ; disable SSE + or eax, (1 << 4) ; enable PSE mov cr4, eax ; Set CR0 From 03cf4a4f940fc3268e1ce55ecf255f67adf155cc Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Sat, 27 Dec 2014 23:21:49 +0100 Subject: [PATCH 3/5] fix wrong page attributes --- arch/x86/mm/page.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/mm/page.c b/arch/x86/mm/page.c index 60c350d..0e45246 100644 --- a/arch/x86/mm/page.c +++ b/arch/x86/mm/page.c @@ -260,7 +260,7 @@ int page_init() /* Map kernel */ addr = (size_t) &kernel_start; npages = PAGE_FLOOR((size_t) &kernel_end - (size_t) &kernel_start) >> PAGE_BITS; - page_map(addr, addr, npages, PG_RW | /* PG_USER | */ PG_GLOBAL); + page_map(addr, addr, npages, PG_RW | PG_GLOBAL); #ifdef CONFIG_VGA /* Map video memory */ @@ -282,7 +282,7 @@ int page_init() for(i=0; imods_count; i++) { addr = mmodule[i].mod_start; npages = PAGE_FLOOR(mmodule[i].mod_end - mmodule[i].mod_start) >> PAGE_BITS; - page_map(addr, addr, npages, PG_USER | PG_GLOBAL); + page_map(addr, addr, npages, PG_GLOBAL); } } } From 22148692970d756e41d0bdc8af7a994d7316b2fb Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Sat, 27 Dec 2014 23:25:25 +0100 Subject: [PATCH 4/5] increasing the readability --- kernel/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/main.c b/kernel/main.c index f072d12..23c6fee 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -139,7 +139,8 @@ int main(void) kprintf("Kernel starts at %p and ends at %p\n", &kernel_start, &kernel_end); kprintf("Processor frequency: %u MHz\n", get_cpu_frequency()); kprintf("Total memory: %lu KiB\n", atomic_int32_read(&total_pages) * PAGE_SIZE / 1024); - kprintf("Total memory available: %lu KiB\n", atomic_int32_read(&total_available_pages) * PAGE_SIZE / 1024); + kprintf("Current allocated memory: %lu KiB\n", atomic_int32_read(&total_allocated_pages) * PAGE_SIZE / 1024); + kprintf("Curren available memory: %lu KiB\n", atomic_int32_read(&total_available_pages) * PAGE_SIZE / 1024); create_kernel_task(&id1, foo, "foo1", NORMAL_PRIO); From 0b49fb79a9903efae13f8820156fbe6fd5188c77 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Sat, 27 Dec 2014 23:26:31 +0100 Subject: [PATCH 5/5] check bitmap boundary --- mm/memory.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index c0d3773..04db566 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -169,22 +169,27 @@ int memory_init(void) // parse multiboot information for available memory if (mb_info) { if (mb_info->flags & MULTIBOOT_INFO_MEM_MAP) { + size_t end_addr; multiboot_memory_map_t* mmap = (multiboot_memory_map_t*) ((size_t) mb_info->mmap_addr); multiboot_memory_map_t* mmap_end = (void*) ((size_t) mb_info->mmap_addr + mb_info->mmap_length); // mark available memory as free while (mmap < mmap_end) { if (mmap->type == MULTIBOOT_MEMORY_AVAILABLE) { - for (addr=mmap->addr; addr < mmap->addr + mmap->len; addr += PAGE_SIZE) { + /* set the available memory as "unused" */ + addr = mmap->addr; + end_addr = addr + mmap->len; + + while ((addr < end_addr) && (addr < (BITMAP_SIZE*8*PAGE_SIZE))) { page_clear_mark(addr >> PAGE_BITS); + addr += PAGE_SIZE; atomic_int32_inc(&total_pages); atomic_int32_inc(&total_available_pages); } } mmap++; } - } - else if (mb_info->flags & MULTIBOOT_INFO_MEM) { + } else if (mb_info->flags & MULTIBOOT_INFO_MEM) { size_t page; size_t pages_lower = mb_info->mem_lower >> 2; /* KiB to page number */ size_t pages_upper = mb_info->mem_upper >> 2; @@ -192,6 +197,9 @@ int memory_init(void) for (page=0; page BITMAP_SIZE*8-256) + pages_upper = BITMAP_SIZE*8-256; + for (page=0; page