- Cleanup
- rewrote early_query() to use the TT0 mapping to remove the page_hole stuff. - fixed natfeat, using a page set up from the bootloader for now as it wants physical address. At least it's enough to see from the debugger: load kernel... kernel entry at 8003711a Welcome to kernel debugger output! Haiku revision: 26582 PANIC: unknown cpu_type 68040 Welcome to Kernel Debugging Land... Running on CPU 0 kdebug> git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26599 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -46,9 +46,10 @@ typedef struct {
|
|||||||
struct {
|
struct {
|
||||||
//XXX: are those meant to be used by physical
|
//XXX: are those meant to be used by physical
|
||||||
// or virtual address ?
|
// or virtual address ?
|
||||||
int32 (*nf_get_id)(const char *);
|
uint32 (*nf_get_id)(const char *);
|
||||||
int32 (*nf_call)(int32, ...);
|
int32 (*nf_call)(uint32, ...);
|
||||||
int32 nf_dprintf_id;
|
addr_t nf_page;
|
||||||
|
uint32 nf_dprintf_id;
|
||||||
} nat_feat;
|
} nat_feat;
|
||||||
} atari;
|
} atari;
|
||||||
} plat_args;
|
} plat_args;
|
||||||
|
|||||||
@@ -628,6 +628,8 @@ mmu_init(void)
|
|||||||
gKernelArgs.num_physical_allocated_ranges++;
|
gKernelArgs.num_physical_allocated_ranges++;
|
||||||
|
|
||||||
|
|
||||||
|
gKernelArgs.arch_args.plat_args.atari.nat_feat.nf_page =
|
||||||
|
get_next_physical_page() /*| 0xff000000*/;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ void *gXHDIEntryPoint = NULL;
|
|||||||
uint32 gXHDIVersion = 0;
|
uint32 gXHDIVersion = 0;
|
||||||
|
|
||||||
NatFeatCookie *gNatFeatCookie = NULL;
|
NatFeatCookie *gNatFeatCookie = NULL;
|
||||||
int32 gDebugPrintfNatFeatID = 0;
|
uint32 gDebugPrintfNatFeatID = 0;
|
||||||
|
|
||||||
/*! Maps TOS error codes to native errors
|
/*! Maps TOS error codes to native errors
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -310,6 +310,7 @@ static inline int Bconputs(int16 handle, const char *string)
|
|||||||
#define NVM_R_YEAR 9
|
#define NVM_R_YEAR 9
|
||||||
#define NVM_R_VIDEO 29
|
#define NVM_R_VIDEO 29
|
||||||
|
|
||||||
|
#define VM_INQUIRE -1
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
#ifndef __ASSEMBLER__
|
||||||
|
|
||||||
@@ -724,12 +725,12 @@ static inline const struct tos_osheader *tos_get_osheader()
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32 magic;
|
uint32 magic;
|
||||||
int32 (*nfGetID) (const char *);
|
uint32 (*nfGetID) (const char *);
|
||||||
int32 (*nfCall) (int32 ID, ...);
|
int32 (*nfCall) (uint32 ID, ...);
|
||||||
} NatFeatCookie;
|
} NatFeatCookie;
|
||||||
|
|
||||||
extern NatFeatCookie *gNatFeatCookie;
|
extern NatFeatCookie *gNatFeatCookie;
|
||||||
extern int32 gDebugPrintfNatFeatID;
|
extern uint32 gDebugPrintfNatFeatID;
|
||||||
|
|
||||||
static inline NatFeatCookie *nat_features(void)
|
static inline NatFeatCookie *nat_features(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "toscalls.h"
|
||||||
#include "video.h"
|
#include "video.h"
|
||||||
//#include "mmu.h"
|
//#include "mmu.h"
|
||||||
//#include "images.h"
|
//#include "images.h"
|
||||||
@@ -130,6 +131,8 @@ extern "C" status_t
|
|||||||
platform_init_video(void)
|
platform_init_video(void)
|
||||||
{
|
{
|
||||||
// ToDo: implement me
|
// ToDo: implement me
|
||||||
|
dprintf("current video mode: \n");
|
||||||
|
dprintf("Vsetmode(-1): 0x%08x\n", VsetMode(VM_INQUIRE));
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,13 +60,6 @@ arch_cpu_init(kernel_args *args)
|
|||||||
arch_mmu_type = args->arch_args.mmu_type;
|
arch_mmu_type = args->arch_args.mmu_type;
|
||||||
arch_platform = args->arch_args.platform;
|
arch_platform = args->arch_args.platform;
|
||||||
arch_platform = args->arch_args.machine;
|
arch_platform = args->arch_args.machine;
|
||||||
void (*flush_insn_pipeline)(void);
|
|
||||||
void (*flush_atc_all)(void);
|
|
||||||
void (*flush_atc_user)(void);
|
|
||||||
void (*flush_atc_addr)(void *addr);
|
|
||||||
void (*flush_dcache)(void *address, size_t len);
|
|
||||||
void (*flush_icache)(void *address, size_t len);
|
|
||||||
void (*idle)(void);
|
|
||||||
|
|
||||||
switch (arch_cpu_type) {
|
switch (arch_cpu_type) {
|
||||||
case 68020:
|
case 68020:
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ return 0;
|
|||||||
frame->a[0], frame->a[1], frame->a[2], frame->a[3]);
|
frame->a[0], frame->a[1], frame->a[2], frame->a[3]);
|
||||||
kprintf(" a4 0x%08lx a5 0x%08lx a6 0x%08lx a7 0x%08lx (sp)\n",
|
kprintf(" a4 0x%08lx a5 0x%08lx a6 0x%08lx a7 0x%08lx (sp)\n",
|
||||||
#warning M68K: a7 in iframe ??
|
#warning M68K: a7 in iframe ??
|
||||||
frame->a[4], frame->a[5], frame->a[6], -1/*frame->a[7]*/);
|
frame->a[4], frame->a[5], frame->a[6], -1L/*frame->a[7]*/);
|
||||||
|
|
||||||
/*kprintf(" pc 0x%08lx ccr 0x%02x\n",
|
/*kprintf(" pc 0x%08lx ccr 0x%02x\n",
|
||||||
frame->pc, frame->ccr);*/
|
frame->pc, frame->ccr);*/
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ typedef struct vm_translation_map_arch_info {
|
|||||||
addr_t pages_to_invalidate[PAGE_INVALIDATE_CACHE_SIZE];
|
addr_t pages_to_invalidate[PAGE_INVALIDATE_CACHE_SIZE];
|
||||||
} vm_translation_map_arch_info;
|
} vm_translation_map_arch_info;
|
||||||
|
|
||||||
#if 1//XXX ?
|
#if 1//XXX:HOLE
|
||||||
static page_table_entry *page_hole = NULL;
|
static page_table_entry *page_hole = NULL;
|
||||||
static page_directory_entry *page_hole_pgdir = NULL;
|
static page_directory_entry *page_hole_pgdir = NULL;
|
||||||
#endif
|
#endif
|
||||||
@@ -110,11 +110,6 @@ static addr_t sIOSpaceBase;
|
|||||||
#define ADDR_REVERSE_SHIFT(x) ((x)<<12)
|
#define ADDR_REVERSE_SHIFT(x) ((x)<<12)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* 7/7/6 split */
|
|
||||||
#define VADDR_TO_PRENT(va) (((va) / B_PAGE_SIZE) / (64*128))
|
|
||||||
#define VADDR_TO_PDENT(va) ((((va) / B_PAGE_SIZE) / 64) % 128)
|
|
||||||
#define VADDR_TO_PTENT(va) (((va) / B_PAGE_SIZE) % 64)
|
|
||||||
|
|
||||||
#define FIRST_USER_PGROOT_ENT (VADDR_TO_PRENT(USER_BASE))
|
#define FIRST_USER_PGROOT_ENT (VADDR_TO_PRENT(USER_BASE))
|
||||||
#define FIRST_USER_PGDIR_ENT (VADDR_TO_PDENT(USER_BASE))
|
#define FIRST_USER_PGDIR_ENT (VADDR_TO_PDENT(USER_BASE))
|
||||||
#define NUM_USER_PGROOT_ENTS (VADDR_TO_PRENT(ROUNDUP(USER_SIZE, B_PAGE_SIZE * 64 * 128)))
|
#define NUM_USER_PGROOT_ENTS (VADDR_TO_PRENT(ROUNDUP(USER_SIZE, B_PAGE_SIZE * 64 * 128)))
|
||||||
@@ -220,26 +215,51 @@ _update_all_pgdirs(int index, page_root_entry e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// XXX currently assumes this translation map is active
|
// this is used before the vm is fully up, it uses the
|
||||||
|
// transparent translation of the first 32MB
|
||||||
|
// a set up by the bootloader.
|
||||||
|
// (XXX: why just 32MB ? TT0 should just map 2G)
|
||||||
static status_t
|
static status_t
|
||||||
early_query(addr_t va, addr_t *_physicalAddress)
|
early_query(addr_t va, addr_t *_physicalAddress)
|
||||||
{
|
{
|
||||||
page_table_entry *pentry;
|
page_root_entry *pr = sKernelVirtualPageRoot;
|
||||||
|
page_directory_entry *pd;
|
||||||
|
page_indirect_entry *pi;
|
||||||
|
page_table_entry *pt;
|
||||||
|
addr_t pa;
|
||||||
|
int32 index;
|
||||||
|
status_t err = B_ERROR; // no pagetable here
|
||||||
|
|
||||||
if (page_hole_pgdir[VADDR_TO_PDENT(va)].type != DT_DIR) {
|
index = VADDR_TO_PRENT(va);
|
||||||
// no pagetable here
|
if (pr && pr[index].type == DT_ROOT) {
|
||||||
return B_ERROR;
|
pa = PRE_TO_TA(pr[index]);
|
||||||
}
|
// pa == va when in TT
|
||||||
#warning M68K: va or VADDR_TO_PTENT(va) ??
|
// and no need to fiddle with cache
|
||||||
pentry = page_hole + va / B_PAGE_SIZE;
|
pd = (page_directory_entry *)pa;
|
||||||
if (pentry->type != DT_PAGE) {
|
|
||||||
// page mapping not valid
|
|
||||||
return B_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
*_physicalAddress = PTE_TO_PA(*pentry);
|
index = VADDR_TO_PDENT(va);
|
||||||
return B_OK;
|
if (pd && pd[index].type == DT_DIR) {
|
||||||
|
pa = PDE_TO_TA(pd[index]);
|
||||||
|
pt = (page_table_entry *)pa;
|
||||||
|
|
||||||
|
index = VADDR_TO_PTENT(va);
|
||||||
|
if (pt && pt[index].type == DT_INDIRECT) {
|
||||||
|
pi = (page_indirect_entry *)pt;
|
||||||
|
pa = PIE_TO_TA(pi[index]);
|
||||||
|
pt = (page_table_entry *)pa;
|
||||||
|
index = 0; // single descriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pt /*&& pt[index].type == DT_PAGE*/) {
|
||||||
|
*_physicalAddress = PTE_TO_PA(pt[index]);
|
||||||
|
// we should only be passed page va, but just in case.
|
||||||
|
*_physicalAddress += va % B_PAGE_SIZE;
|
||||||
|
err = B_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -705,14 +725,14 @@ query_tmap_interrupt(vm_translation_map *map, addr_t va, addr_t *_physical,
|
|||||||
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);
|
||||||
arch_cpu_invalidate_TLB_range((addr_t)pt, (addr_t)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);
|
||||||
arch_cpu_invalidate_TLB_range((addr_t)pt, (addr_t)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 = (page_indirect_entry *)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);
|
||||||
@@ -1178,7 +1198,7 @@ m68k_vm_translation_map_init(kernel_args *args)
|
|||||||
status_t error;
|
status_t error;
|
||||||
|
|
||||||
TRACE(("vm_translation_map_init: entry\n"));
|
TRACE(("vm_translation_map_init: entry\n"));
|
||||||
#if 0
|
#if 0//XXX:HOLE
|
||||||
// page hole set up in stage2
|
// page hole set up in stage2
|
||||||
page_hole = (page_table_entry *)args->arch_args.page_hole;
|
page_hole = (page_table_entry *)args->arch_args.page_hole;
|
||||||
// calculate where the pgdir would be
|
// calculate where the pgdir would be
|
||||||
@@ -1215,6 +1235,7 @@ m68k_vm_translation_map_init(kernel_args *args)
|
|||||||
|
|
||||||
TRACE(("mapping iospace_pgtables\n"));
|
TRACE(("mapping iospace_pgtables\n"));
|
||||||
|
|
||||||
|
#if 0
|
||||||
// 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
|
||||||
{
|
{
|
||||||
@@ -1231,6 +1252,7 @@ m68k_vm_translation_map_init(kernel_args *args)
|
|||||||
put_pgtable_in_pgdir(e, phys_pgtable, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
|
put_pgtable_in_pgdir(e, phys_pgtable, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
TRACE(("vm_translation_map_init: done\n"));
|
TRACE(("vm_translation_map_init: done\n"));
|
||||||
|
|
||||||
@@ -1260,8 +1282,10 @@ m68k_vm_translation_map_init_post_area(kernel_args *args)
|
|||||||
// unmap the page hole hack we were using before
|
// unmap the page hole hack we were using before
|
||||||
#warning M68K: FIXME
|
#warning M68K: FIXME
|
||||||
//sKernelVirtualPageRoot[1023].present = 0;
|
//sKernelVirtualPageRoot[1023].present = 0;
|
||||||
|
#if 0
|
||||||
page_hole_pgdir = NULL;
|
page_hole_pgdir = NULL;
|
||||||
page_hole = NULL;
|
page_hole = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
temp = (void *)sKernelVirtualPageRoot;
|
temp = (void *)sKernelVirtualPageRoot;
|
||||||
area = create_area("kernel_pgdir", &temp, B_EXACT_ADDRESS, B_PAGE_SIZE,
|
area = create_area("kernel_pgdir", &temp, B_EXACT_ADDRESS, B_PAGE_SIZE,
|
||||||
|
|||||||
Reference in New Issue
Block a user