From 30145fa1fd2f675b869320f61b5cdbd6d643fd2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Mon, 7 Jul 2008 11:22:26 +0000 Subject: [PATCH] - handle the supervisor bit from SR correctly on iframes - various notes on 060 vs others: - 060 has 040 compatible mmu, except pgtables must *not* be on copyback memory - 060 has a processor control reg which has a revision number to use in system_info - notes on ctx switch: - must be kept in sync with asm code - fsave generate variable size frames, so reserve space and use non-predecrementing EA. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26288 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/arch/m68k/arch_asm.S | 2 ++ src/system/kernel/arch/m68k/arch_system_info.cpp | 1 + src/system/kernel/arch/m68k/arch_thread.c | 4 ++-- src/system/kernel/arch/m68k/arch_user_debugger.cpp | 2 ++ src/system/kernel/arch/m68k/arch_vm_translation_map.cpp | 7 +++++-- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/system/kernel/arch/m68k/arch_asm.S b/src/system/kernel/arch/m68k/arch_asm.S index 09d2913fa0..b96a7db1aa 100644 --- a/src/system/kernel/arch/m68k/arch_asm.S +++ b/src/system/kernel/arch/m68k/arch_asm.S @@ -79,6 +79,7 @@ FUNCTION(get_time_base): #warning M68K: FIX m68k_context_switch +// XXX:sync with arch_thread.c:arch_thread_init_kthread_stack // void m68k_context_switch(addr_t *old_sp, addr_t new_sp); FUNCTION(m68k_context_switch): // save fp ? @@ -86,6 +87,7 @@ FUNCTION(m68k_context_switch): movem.l %d0-%d7/%a0-%a7,-(%sp) fmovem %fp0-%fp7,-(%sp) fsave -(%sp) +#warning M68K: use fixed size for fsave // XXX diff --git a/src/system/kernel/arch/m68k/arch_system_info.cpp b/src/system/kernel/arch/m68k/arch_system_info.cpp index e6615c0bed..3a20141ca8 100644 --- a/src/system/kernel/arch/m68k/arch_system_info.cpp +++ b/src/system/kernel/arch/m68k/arch_system_info.cpp @@ -46,6 +46,7 @@ arch_system_info_init(struct kernel_args *args) sBusClockFrequency = args->arch_args.bus_frequency; sCPURevision = args->arch_args.cpu_type; //XXX +#warning M68K: use 060 PCR[15:8] sCPUType = B_CPU_M68K; return B_OK; diff --git a/src/system/kernel/arch/m68k/arch_thread.c b/src/system/kernel/arch/m68k/arch_thread.c index 617786c0b6..4eb09d803c 100644 --- a/src/system/kernel/arch/m68k/arch_thread.c +++ b/src/system/kernel/arch/m68k/arch_thread.c @@ -84,8 +84,8 @@ m68k_get_user_iframe(void) for (i = thread->arch_info.iframes.index - 1; i >= 0; i--) { struct iframe *frame = thread->arch_info.iframes.frames[i]; -// if (frame->srr1 & MSR_PRIVILEGE_LEVEL) -// return frame; + if (frame->sr & (1 << M68K_SR_S) == 0) + return frame; } return NULL; diff --git a/src/system/kernel/arch/m68k/arch_user_debugger.cpp b/src/system/kernel/arch/m68k/arch_user_debugger.cpp index a48fc52217..312396674a 100644 --- a/src/system/kernel/arch/m68k/arch_user_debugger.cpp +++ b/src/system/kernel/arch/m68k/arch_user_debugger.cpp @@ -52,6 +52,8 @@ arch_update_thread_single_step() // 0 1 trace on flow // 1 0 single step // 1 1 undef + // note 060 and 020(?) only have T1 bit, + // but this should be compatible as well. if (thread->debug_info.flags & B_THREAD_DEBUG_SINGLE_STEP) { frame->cpu.sr &= ~(M68K_SR_T_MASK); frame->cpu.sr |= (1 << M68K_SR_T1); diff --git a/src/system/kernel/arch/m68k/arch_vm_translation_map.cpp b/src/system/kernel/arch/m68k/arch_vm_translation_map.cpp index f49723ff9c..6add81e01f 100644 --- a/src/system/kernel/arch/m68k/arch_vm_translation_map.cpp +++ b/src/system/kernel/arch/m68k/arch_vm_translation_map.cpp @@ -28,10 +28,13 @@ * so we use a function array to switch to the one we want. */ +#warning M68K: 060: must *not* have pgtables in copyback cachable mem!!! + //extern struct m68k_vm_ops m68851_vm_ops; extern struct m68k_vm_ops m68030_vm_ops; -//extern struct m68k_vm_ops m68030_vm_ops; -//extern struct m68k_vm_ops m68030_vm_ops; +//extern struct m68k_vm_ops m68040_vm_ops; +// 060 should be identical to 040 except for copyback issue +//extern struct m68k_vm_ops m68060_vm_ops; #warning M68K: use a static! m68k_vm_ops *get_vm_ops()