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
This commit is contained in:
parent
ae5dc7df6f
commit
563758b1bd
@ -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))
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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];
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user