From 563758b1bd168a988855089df37821e1e8b5f17e Mon Sep 17 00:00:00 2001 From: josh Date: Mon, 1 Feb 2010 04:21:29 +0000 Subject: [PATCH] added PAGE_DIR_SELF_REF2 to fix bug in page directory self-referencing git-svn-id: svn://anubis/hos/trunk@100 5b3e749e-e535-0410-8002-a9bb6afbdfca --- kernel/include/hos_defines.h | 2 +- kernel/mm/mm.cc | 8 ++++---- kernel/mm/mm.h | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/kernel/include/hos_defines.h b/kernel/include/hos_defines.h index 8228852..e9a7c41 100644 --- a/kernel/include/hos_defines.h +++ b/kernel/include/hos_defines.h @@ -6,7 +6,7 @@ #define KERNEL_OFFSET 0x00000000 -#define PAGE_LOG_SIZE 12 +#define PAGE_LOG_SIZE 12u #define PAGE_SIZE (1 << PAGE_LOG_SIZE) #define PAGE_HIGH_MASK (0xFFFFFFFFu << PAGE_LOG_SIZE) #define PAGE_LOW_MASK (0xFFFFFFFFu >> (32 - PAGE_LOG_SIZE)) diff --git a/kernel/mm/mm.cc b/kernel/mm/mm.cc index 3827379..20b0ac3 100644 --- a/kernel/mm/mm.cc +++ b/kernel/mm/mm.cc @@ -147,7 +147,7 @@ void mm_bootstrap() /* ok, now mm_early_map() should be functional */ /* map in the page directory itself so we can modify it once paging is on */ - mm_early_map(PAGE_DIR_SELF_REF, page_directory_phys, 0, 1); + mm_early_map(PAGE_DIR_SELF_REF2, page_directory_phys, 0, 1); /* map in the physical page allocator pages */ for (int i = 0; i <= last_page_alloc_page; i++) @@ -262,7 +262,8 @@ int mm_early_map(u32_t virtual_address, u32_t physical_address, u32_t page_table_phys = (*early_page_directory_ptr)[directory_index] & PAGE_HIGH_MASK; - u32_t * page_table = (u32_t *) (page_table_phys + KERNEL_OFFSET); + pagedirectory_entry_t * page_table = + (pagedirectory_entry_t *) (page_table_phys + KERNEL_OFFSET); page_table[table_index] = (physical_address & PAGE_HIGH_MASK) | (user_mode & 0x1) << 2 @@ -282,8 +283,7 @@ int mm_map(u32_t virtual_address, u32_t physical_address, u32_t directory_index = (virtual_address >> 22) & 0x3FF; u32_t table_index = (virtual_address >> 12) & 0x3FF; pagedirectory_entry_t * page_dir_entry = (pagedirectory_entry_t *) - (PAGE_DIR_SELF_REF | (PAGE_DIR_SELF_REF_INDEX << 12) - | (directory_index << 2)); + (PAGE_DIR_SELF_REF2 | (directory_index << 2)); if (*page_dir_entry == 0) { diff --git a/kernel/mm/mm.h b/kernel/mm/mm.h index fea5997..74b24ce 100644 --- a/kernel/mm/mm.h +++ b/kernel/mm/mm.h @@ -13,8 +13,9 @@ typedef u32_t pagedirectory_entry_t; #define NUM_PAGETABLE_ENTRIES (PAGE_SIZE / sizeof(pagedirectory_entry_t)) -#define PAGE_DIR_SELF_REF (0x20000000 - (PAGE_SIZE * NUM_PAGETABLE_ENTRIES)) +#define PAGE_DIR_SELF_REF (0x20000000u - (PAGE_SIZE * NUM_PAGETABLE_ENTRIES)) #define PAGE_DIR_SELF_REF_INDEX ((PAGE_DIR_SELF_REF >> 22) & 0x3FF) +#define PAGE_DIR_SELF_REF2 (PAGE_DIR_SELF_REF | (PAGE_DIR_SELF_REF_INDEX << 12)) typedef pagedirectory_entry_t pagedirectory_t[NUM_PAGETABLE_ENTRIES];