From 7a1fd4cbf8a88d0f7139099169f0c17c250270b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Fri, 1 Aug 2008 16:01:02 +0000 Subject: [PATCH] allocate all kernel page directories at boot, this will simplify later code a lot. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26721 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/boot/platform/atari_m68k/mmu.cpp | 4 +++ src/system/boot/platform/atari_m68k/mmu.h | 1 + .../boot/platform/atari_m68k/mmu_030.cpp | 25 ++++++++++++++++ .../boot/platform/atari_m68k/mmu_040.cpp | 30 +++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/src/system/boot/platform/atari_m68k/mmu.cpp b/src/system/boot/platform/atari_m68k/mmu.cpp index 728ec17d92..5dca4cc802 100644 --- a/src/system/boot/platform/atari_m68k/mmu.cpp +++ b/src/system/boot/platform/atari_m68k/mmu.cpp @@ -270,8 +270,12 @@ init_page_directory(void) // set the root pointers gMMUOps->load_rp(gPageRoot); + // allocate second level tables for kernel space + // this will simplify mmu code a lot, and only wastes 32KB + gMMUOps->allocate_kernel_pgdirs(); // enable mmu translation gMMUOps->enable_paging(); + //XXX: check for errors //gKernelArgs.arch_args.num_pgtables = 0; gMMUOps->add_page_table(KERNEL_BASE); diff --git a/src/system/boot/platform/atari_m68k/mmu.h b/src/system/boot/platform/atari_m68k/mmu.h index 65b8a3a36b..196a3bc14f 100644 --- a/src/system/boot/platform/atari_m68k/mmu.h +++ b/src/system/boot/platform/atari_m68k/mmu.h @@ -31,6 +31,7 @@ struct boot_mmu_ops { status_t (*set_tt)(int which, addr_t pa, size_t len, uint32 perms); /* load root pointers */ status_t (*load_rp)(addr_t pa); + status_t (*allocate_kernel_pgdirs)(void); status_t (*enable_paging)(void); status_t (*add_page_table)(addr_t virtualAddress); void (*unmap_page)(addr_t virtualAddress); diff --git a/src/system/boot/platform/atari_m68k/mmu_030.cpp b/src/system/boot/platform/atari_m68k/mmu_030.cpp index 407c435480..699e75e2f9 100644 --- a/src/system/boot/platform/atari_m68k/mmu_030.cpp +++ b/src/system/boot/platform/atari_m68k/mmu_030.cpp @@ -103,6 +103,30 @@ load_rp(addr_t pa) } +static status_t +allocate_kernel_pgdirs(void) +{ + page_root_entry *pr = gPageRoot; + page_directory_entry *pd; + addr_t tbl; + int i; + + // we'll fill in the 2nd half with ready made page dirs + for (i = NUM_ROOTENT_PER_TBL/2; i < NUM_ROOTENT_PER_TBL; i++) { + if (i % NUM_DIRTBL_PER_PAGE) + tbl += SIZ_DIRTBL; + else + tbl = mmu_get_next_page_tables(); + pr[i].addr = TA_TO_PREA(tbl); + pr[i].type = DT_ROOT; + pd = (page_directory_entry *)tbl; + for (int32 j = 0; j < NUM_DIRENT_PER_TBL; j++) + *(page_directory_entry_scalar *)(&pd[j]) = DFL_DIRENT_VAL; + } + return B_OK; +} + + static status_t enable_paging(void) { @@ -115,5 +139,6 @@ const struct boot_mmu_ops k030MMUOps = { &initialize, &set_tt, &load_rp, + &allocate_kernel_pgdirs, &enable_paging }; diff --git a/src/system/boot/platform/atari_m68k/mmu_040.cpp b/src/system/boot/platform/atari_m68k/mmu_040.cpp index c939fa9120..69f2f005eb 100644 --- a/src/system/boot/platform/atari_m68k/mmu_040.cpp +++ b/src/system/boot/platform/atari_m68k/mmu_040.cpp @@ -107,6 +107,30 @@ load_rp(addr_t pa) } +static status_t +allocate_kernel_pgdirs(void) +{ + page_root_entry *pr = gPageRoot; + page_directory_entry *pd; + addr_t tbl; + int i; + + // we'll fill in the 2nd half with ready made page dirs + for (i = NUM_ROOTENT_PER_TBL/2; i < NUM_ROOTENT_PER_TBL; i++) { + if (i % NUM_DIRTBL_PER_PAGE) + tbl += SIZ_DIRTBL; + else + tbl = mmu_get_next_page_tables(); + pr[i].addr = TA_TO_PREA(tbl); + pr[i].type = DT_ROOT; + pd = (page_directory_entry *)tbl; + for (int32 j = 0; j < NUM_DIRENT_PER_TBL; j++) + *(page_directory_entry_scalar *)(&pd[j]) = DFL_DIRENT_VAL; + } + return B_OK; +} + + static status_t enable_paging(void) { @@ -137,6 +161,10 @@ add_page_table(addr_t virtualAddress) // thanks to transparent translation index = VADDR_TO_PRENT(virtualAddress); + if (pr[index].type != DT_ROOT) + panic("invalid page root entry %d\n", index); +#if 0 + // not needed anymore if (pr[index].type != DT_ROOT) { unsigned aindex = index & ~(NUM_DIRTBL_PER_PAGE-1); /* aligned */ //TRACE(("missing page root entry %d ai %d\n", index, aindex)); @@ -157,6 +185,7 @@ add_page_table(addr_t virtualAddress) tbl += SIZ_DIRTBL; } } +#endif pd = (page_directory_entry *)PRE_TO_TA(pr[index]); index = VADDR_TO_PDENT(virtualAddress); @@ -290,6 +319,7 @@ const struct boot_mmu_ops k040MMUOps = { &initialize, &set_tt, &load_rp, + &allocate_kernel_pgdirs, &enable_paging, &add_page_table, &unmap_page,