kernel compiles but doesn't link yet.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26092 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
François Revol
2008-06-23 01:23:16 +00:00
parent 4079af86ca
commit 4237dbd0fc
3 changed files with 62 additions and 49 deletions
+7 -7
View File
@@ -16,13 +16,13 @@
struct m68k_vm_ops m68030_vm_ops = { struct m68k_vm_ops m68030_vm_ops = {
m68k_translation_map_get_pgdir, m68k_translation_map_get_pgdir,
arch_vm_translation_map_init_map, m68k_vm_translation_map_init_map,
arch_vm_translation_map_init_kernel_map_post_sem, m68k_vm_translation_map_init_kernel_map_post_sem,
arch_vm_translation_map_init, m68k_vm_translation_map_init,
arch_vm_translation_map_init_post_area, m68k_vm_translation_map_init_post_area,
arch_vm_translation_map_init_post_sem, m68k_vm_translation_map_init_post_sem,
arch_vm_translation_map_early_map, m68k_vm_translation_map_early_map,
arch_vm_translation_map_early_query, /*m68k_vm_translation_map_*/early_query,
#if 0 #if 0
m68k_map_address_range, m68k_map_address_range,
m68k_unmap_address_range, m68k_unmap_address_range,
+2 -1
View File
@@ -132,8 +132,9 @@ arch_cpu_memory_write_barrier(void)
void void
arch_cpu_invalidate_TLB_range(addr_t start, addr_t end) arch_cpu_invalidate_TLB_range(addr_t start, addr_t end)
{ {
int32 num_pages = end / B_PAGE_SIZE - start / B_PAGE_SIZE;
cpu_ops.flush_insn_pipeline(); cpu_ops.flush_insn_pipeline();
while (start < end) { while (num_pages-- >= 0) {
cpu_ops.flush_atc_addr(start); cpu_ops.flush_atc_addr(start);
cpu_ops.flush_insn_pipeline(); cpu_ops.flush_insn_pipeline();
start += B_PAGE_SIZE; start += B_PAGE_SIZE;
@@ -42,8 +42,10 @@
#include <KernelExport.h> #include <KernelExport.h>
#include <kernel.h> #include <kernel.h>
#include <heap.h>
#include <vm.h> #include <vm.h>
#include <vm_address_space.h> #include <vm_address_space.h>
#include <vm_page.h>
#include <vm_priv.h> #include <vm_priv.h>
#include <int.h> #include <int.h>
#include <boot/kernel_args.h> #include <boot/kernel_args.h>
@@ -184,6 +186,23 @@ update_page_table_entry(page_table_entry *entry, page_table_entry *with)
} }
static inline void
init_page_indirect_entry(page_indirect_entry *entry)
{
#warning M68K: is it correct ?
*(page_indirect_entry_scalar *)entry = DFL_PAGEENT_VAL;
}
static inline void
update_page_indirect_entry(page_indirect_entry *entry, page_indirect_entry *with)
{
// update page table entry atomically
// XXX: is it ?? (long desc?)
*(page_indirect_entry_scalar *)entry = *(page_indirect_entry_scalar *)with;
}
static void static void
_update_all_pgdirs(int index, page_root_entry e) _update_all_pgdirs(int index, page_root_entry e)
{ {
@@ -425,7 +444,7 @@ put_page_indirect_entry_in_pgtable(page_indirect_entry *entry,
addr_t physicalAddress, uint32 attributes, bool globalPage) addr_t physicalAddress, uint32 attributes, bool globalPage)
{ {
page_indirect_entry page; page_indirect_entry page;
init_page_table_entry(&page); init_page_indirect_entry(&page);
page.addr = TA_TO_PIEA(physicalAddress); page.addr = TA_TO_PIEA(physicalAddress);
page.type = DT_INDIRECT; page.type = DT_INDIRECT;
@@ -433,7 +452,7 @@ put_page_indirect_entry_in_pgtable(page_indirect_entry *entry,
// there are no protection bits in indirect descriptor usually. // there are no protection bits in indirect descriptor usually.
// put it in the page table // put it in the page table
update_page_table_entry(entry, &page); update_page_indirect_entry(entry, &page);
} }
@@ -674,49 +693,49 @@ query_tmap_interrupt(vm_translation_map *map, addr_t va, addr_t *_physical,
page_indirect_entry *pi; page_indirect_entry *pi;
page_table_entry *pt; page_table_entry *pt;
addr_t physicalPageTable; addr_t physicalPageTable;
int32 cpu = smp_get_current_cpu();
int32 index; int32 index;
status_t err = B_ERROR; // no pagetable here status_t err = B_ERROR; // no pagetable here
if (sQueryPage == NULL) if (sQueryPage == NULL)
return err; // not yet initialized !? return err; // not yet initialized !?
index = VADDR_TO_PRENT(va); index = VADDR_TO_PRENT(va);
if (pr && pr[index].type == DT_ROOT) { if (pr && pr[index].type == DT_ROOT) {
put_page_table_entry_in_pgtable(&sQueryDesc, PRE_TO_TA(pr[index]), B_KERNEL_READ_AREA, false); put_page_table_entry_in_pgtable(&sQueryDesc, PRE_TO_TA(pr[index]), B_KERNEL_READ_AREA, false);
invalidate_TLB(pt); arch_cpu_invalidate_TLB_range((addr_t)pt, (addr_t)pt);
pd = (page_directory_entry *)sQueryPage; pd = (page_directory_entry *)sQueryPage;
index = VADDR_TO_PDENT(va); index = VADDR_TO_PDENT(va);
if (pd && pd[index].type == DT_DIR) { if (pd && pd[index].type == DT_DIR) {
put_page_table_entry_in_pgtable(&sQueryDesc, PDE_TO_TA(pd[index]), B_KERNEL_READ_AREA, false); put_page_table_entry_in_pgtable(&sQueryDesc, PDE_TO_TA(pd[index]), B_KERNEL_READ_AREA, false);
invalidate_TLB(pt); arch_cpu_invalidate_TLB_range((addr_t)pt, (addr_t)pt);
pt = (page_table_entry *)sQueryPage; pt = (page_table_entry *)sQueryPage;
index = VADDR_TO_PTENT(va); index = VADDR_TO_PTENT(va);
if (pt && pt[index].type == DT_INDIRECT) { if (pt && pt[index].type == DT_INDIRECT) {
pi = pt; pi = (page_indirect_entry *)pt;
put_page_table_entry_in_pgtable(&sQueryDesc, PIE_TO_TA(pi[index]), B_KERNEL_READ_AREA, false); put_page_table_entry_in_pgtable(&sQueryDesc, PIE_TO_TA(pi[index]), B_KERNEL_READ_AREA, false);
invalidate_TLB(pt); arch_cpu_invalidate_TLB_range((addr_t)pt, (addr_t)pt);
pt = (page_table_entry *)sQueryPage; pt = (page_table_entry *)sQueryPage;
index = 0; // single descriptor index = 0; // single descriptor
} }
if (pt /*&& pt[index].type == DT_PAGE*/) { if (pt /*&& pt[index].type == DT_PAGE*/) {
*_physical = PTE_TO_PA(pt[index]); *_physical = PTE_TO_PA(pt[index]);
// we should only be passed page va, but just in case. // we should only be passed page va, but just in case.
*_physical += va % B_PAGE_SIZE; *_physical += va % B_PAGE_SIZE;
*_flags |= ((pt[index].write_protect ? 0 : B_KERNEL_WRITE_AREA : 0) | B_KERNEL_READ_AREA) *_flags |= ((pt[index].write_protect ? 0 : B_KERNEL_WRITE_AREA) | B_KERNEL_READ_AREA)
| (pt[index].dirty ? PAGE_MODIFIED : 0) | (pt[index].dirty ? PAGE_MODIFIED : 0)
| (pt[index].accessed ? PAGE_ACCESSED : 0) | (pt[index].accessed ? PAGE_ACCESSED : 0)
| ((pt[index].type == DT_PAGE) ? PAGE_PRESENT : 0); | ((pt[index].type == DT_PAGE) ? PAGE_PRESENT : 0);
err = B_OK; err = B_OK;
} }
}
} }
// unmap the pg table from the indirect desc. // unmap the pg table from the indirect desc.
sQueryDesc.type = DT_INVALID; sQueryDesc.type = DT_INVALID;
return err; return err;
} }
@@ -751,7 +770,7 @@ query_tmap(vm_translation_map *map, addr_t va, addr_t *_physical, uint32 *_flags
pd += (index % NUM_DIRTBL_PER_PAGE) * NUM_DIRENT_PER_TBL; pd += (index % NUM_DIRTBL_PER_PAGE) * NUM_DIRENT_PER_TBL;
index = VADDR_TO_PDENT(start); index = VADDR_TO_PDENT(va);
if (pd[index].type != DT_DIR) { if (pd[index].type != DT_DIR) {
// no pagetable here // no pagetable here
put_physical_page_tmap(pd_pg); put_physical_page_tmap(pd_pg);
@@ -770,7 +789,7 @@ query_tmap(vm_translation_map *map, addr_t va, addr_t *_physical, uint32 *_flags
// handle indirect descriptor // handle indirect descriptor
if (pt[index].type == DT_INDIRECT) { if (pt[index].type == DT_INDIRECT) {
pi = pt; pi = (page_indirect_entry *)pt;
pi_pg = pt_pg; pi_pg = pt_pg;
do { do {
status = get_physical_page_tmap(PIE_TO_PA(pi[index]), status = get_physical_page_tmap(PIE_TO_PA(pi[index]),
@@ -918,7 +937,7 @@ clear_flags_tmap(vm_translation_map *map, addr_t va, uint32 flags)
pd += (index % NUM_DIRTBL_PER_PAGE) * NUM_DIRENT_PER_TBL; pd += (index % NUM_DIRTBL_PER_PAGE) * NUM_DIRENT_PER_TBL;
index = VADDR_TO_PDENT(start); index = VADDR_TO_PDENT(va);
if (pd[index].type != DT_DIR) { if (pd[index].type != DT_DIR) {
// no pagetable here // no pagetable here
put_physical_page_tmap(pd_pg); put_physical_page_tmap(pd_pg);
@@ -937,7 +956,7 @@ clear_flags_tmap(vm_translation_map *map, addr_t va, uint32 flags)
// handle indirect descriptor // handle indirect descriptor
if (pt[index].type == DT_INDIRECT) { if (pt[index].type == DT_INDIRECT) {
pi = pt; pi = (page_indirect_entry *)pt;
pi_pg = pt_pg; pi_pg = pt_pg;
do { do {
status = get_physical_page_tmap(PIE_TO_PA(pi[index]), status = get_physical_page_tmap(PIE_TO_PA(pi[index]),
@@ -991,12 +1010,8 @@ flush_tmap(vm_translation_map *map)
if (IS_KERNEL_MAP(map)) { if (IS_KERNEL_MAP(map)) {
arch_cpu_global_TLB_invalidate(); arch_cpu_global_TLB_invalidate();
smp_send_broadcast_ici(SMP_MSG_GLOBAL_INVALIDATE_PAGES, 0, 0, 0, NULL,
SMP_MSG_FLAG_SYNC);
} else { } else {
arch_cpu_user_TLB_invalidate(); arch_cpu_user_TLB_invalidate();
smp_send_broadcast_ici(SMP_MSG_USER_INVALIDATE_PAGES, 0, 0, 0, NULL,
SMP_MSG_FLAG_SYNC);
} }
} else { } else {
TRACE(("flush_tmap: %d pages to invalidate, invalidate list\n", TRACE(("flush_tmap: %d pages to invalidate, invalidate list\n",
@@ -1004,10 +1019,6 @@ flush_tmap(vm_translation_map *map)
arch_cpu_invalidate_TLB_list(map->arch_data->pages_to_invalidate, arch_cpu_invalidate_TLB_list(map->arch_data->pages_to_invalidate,
map->arch_data->num_invalidate_pages); map->arch_data->num_invalidate_pages);
smp_send_broadcast_ici(SMP_MSG_INVALIDATE_PAGE_LIST,
(uint32)map->arch_data->pages_to_invalidate,
map->arch_data->num_invalidate_pages, 0, NULL,
SMP_MSG_FLAG_SYNC);
} }
map->arch_data->num_invalidate_pages = 0; map->arch_data->num_invalidate_pages = 0;
@@ -1042,9 +1053,9 @@ map_iospace_chunk(addr_t va, addr_t pa)
state = disable_interrupts(); state = disable_interrupts();
arch_cpu_invalidate_TLB_range(va, va + (IOSPACE_CHUNK_SIZE - B_PAGE_SIZE)); arch_cpu_invalidate_TLB_range(va, va + (IOSPACE_CHUNK_SIZE - B_PAGE_SIZE));
smp_send_broadcast_ici(SMP_MSG_INVALIDATE_PAGE_RANGE, //smp_send_broadcast_ici(SMP_MSG_INVALIDATE_PAGE_RANGE,
va, va + (IOSPACE_CHUNK_SIZE - B_PAGE_SIZE), 0, // va, va + (IOSPACE_CHUNK_SIZE - B_PAGE_SIZE), 0,
NULL, SMP_MSG_FLAG_SYNC); // NULL, SMP_MSG_FLAG_SYNC);
restore_interrupts(state); restore_interrupts(state);
return B_OK; return B_OK;
@@ -1088,7 +1099,7 @@ static vm_translation_map_ops tmap_ops = {
static status_t static status_t
arch_vm_translation_map_init_map(vm_translation_map *map, bool kernel) m68k_vm_translation_map_init_map(vm_translation_map *map, bool kernel)
{ {
if (map == NULL) if (map == NULL)
return B_BAD_VALUE; return B_BAD_VALUE;
@@ -1154,14 +1165,14 @@ arch_vm_translation_map_init_map(vm_translation_map *map, bool kernel)
static status_t static status_t
arch_vm_translation_map_init_kernel_map_post_sem(vm_translation_map *map) m68k_vm_translation_map_init_kernel_map_post_sem(vm_translation_map *map)
{ {
return B_OK; return B_OK;
} }
static status_t static status_t
arch_vm_translation_map_init(kernel_args *args) m68k_vm_translation_map_init(kernel_args *args)
{ {
status_t error; status_t error;
@@ -1185,7 +1196,7 @@ arch_vm_translation_map_init(kernel_args *args)
// allocate some space to hold physical page mapping info // allocate some space to hold physical page mapping info
//XXX: check page count //XXX: check page count
#error XXXXXXXXXXXX pt + pd? pd = memalign ? #warning M68K: XXXXXXXXXXXX pt + pd? pd = memalign ?
iospace_pgtables = (page_table_entry *)vm_allocate_early(args, iospace_pgtables = (page_table_entry *)vm_allocate_early(args,
B_PAGE_SIZE * (IOSPACE_SIZE / (B_PAGE_SIZE * NUM_PAGEENT_PER_TBL * NUM_PAGETBL_PER_PAGE)), ~0L, B_PAGE_SIZE * (IOSPACE_SIZE / (B_PAGE_SIZE * NUM_PAGEENT_PER_TBL * NUM_PAGETBL_PER_PAGE)), ~0L,
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
@@ -1206,7 +1217,7 @@ arch_vm_translation_map_init(kernel_args *args)
// put the array of pgtables directly into the kernel pagedir // put the array of pgtables directly into the kernel pagedir
// these will be wired and kept mapped into virtual space to be easy to get to // these will be wired and kept mapped into virtual space to be easy to get to
{ {
#error XXXXXXXXXXXX #warning M68K: XXXXXXXXXXXX
addr_t phys_pgtable; addr_t phys_pgtable;
addr_t virt_pgtable; addr_t virt_pgtable;
page_directory_entry *e; page_directory_entry *e;
@@ -1227,26 +1238,27 @@ arch_vm_translation_map_init(kernel_args *args)
static status_t static status_t
arch_vm_translation_map_init_post_sem(kernel_args *args) m68k_vm_translation_map_init_post_sem(kernel_args *args)
{ {
return generic_vm_physical_page_mapper_init_post_sem(args); return generic_vm_physical_page_mapper_init_post_sem(args);
} }
static status_t static status_t
arch_vm_translation_map_init_post_area(kernel_args *args) m68k_vm_translation_map_init_post_area(kernel_args *args)
{ {
// now that the vm is initialized, create a region that represents // now that the vm is initialized, create a region that represents
// the page hole // the page hole
void *temp; void *temp;
status_t error; status_t error;
area_id area; area_id area;
void *queryPage; addr_t queryPage;
TRACE(("vm_translation_map_init_post_area: entry\n")); TRACE(("vm_translation_map_init_post_area: entry\n"));
// unmap the page hole hack we were using before // unmap the page hole hack we were using before
sKernelVirtualPageRoot[1023].present = 0; #warning M68K: FIXME
//sKernelVirtualPageRoot[1023].present = 0;
page_hole_pgdir = NULL; page_hole_pgdir = NULL;
page_hole = NULL; page_hole = NULL;
@@ -1315,19 +1327,19 @@ arch_vm_translation_map_init_post_area(kernel_args *args)
//sQueryPageTable = (page_indirect_entry *)(queryPage); //sQueryPageTable = (page_indirect_entry *)(queryPage);
index = VADDR_TO_PRENT((addr_t)queryPage); index = VADDR_TO_PRENT(queryPage);
physicalPageDir = PRE_TO_PA(sKernelVirtualPageRoot[index]); physicalPageDir = PRE_TO_PA(sKernelVirtualPageRoot[index]);
get_physical_page_tmap(physicalPageDir, get_physical_page_tmap(physicalPageDir,
(addr_t *)&pageDirEntry, PHYSICAL_PAGE_NO_WAIT); (addr_t *)&pageDirEntry, PHYSICAL_PAGE_NO_WAIT);
index = VADDR_TO_PDENT((addr_t)queryPage); index = VADDR_TO_PDENT(queryPage);
physicalPageTable = PDE_TO_PA(pageDirEntry[index]); physicalPageTable = PDE_TO_PA(pageDirEntry[index]);
get_physical_page_tmap(physicalPageTable, get_physical_page_tmap(physicalPageTable,
(addr_t *)&pageTableEntry, PHYSICAL_PAGE_NO_WAIT); (addr_t *)&pageTableEntry, PHYSICAL_PAGE_NO_WAIT);
index = VADDR_TO_PTENT((addr_t)queryPage); index = VADDR_TO_PTENT(queryPage);
put_page_indirect_entry_in_pgtable(&pageTableEntry[index], physicalIndirectDesc, put_page_indirect_entry_in_pgtable(&pageTableEntry[index], physicalIndirectDesc,
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, false); B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, false);
@@ -1351,7 +1363,7 @@ arch_vm_translation_map_init_post_area(kernel_args *args)
// into a 4 MB region. It's only used here, and is later unmapped. // into a 4 MB region. It's only used here, and is later unmapped.
static status_t static status_t
arch_vm_translation_map_early_map(kernel_args *args, addr_t va, addr_t pa, m68k_vm_translation_map_early_map(kernel_args *args, addr_t va, addr_t pa,
uint8 attributes, addr_t (*get_free_page)(kernel_args *)) uint8 attributes, addr_t (*get_free_page)(kernel_args *))
{ {
int index; int index;
@@ -1360,7 +1372,7 @@ arch_vm_translation_map_early_map(kernel_args *args, addr_t va, addr_t pa,
// check to see if a page table exists for this range // check to see if a page table exists for this range
index = VADDR_TO_PDENT(va); index = VADDR_TO_PDENT(va);
if (page_hole_pgdir[index].present == 0) { if (page_hole_pgdir[index].type == DT_PAGE) {
addr_t pgtable; addr_t pgtable;
page_directory_entry *e; page_directory_entry *e;
// we need to allocate a pgtable // we need to allocate a pgtable