From 7d49488b803bc04dd9f09a8843cd7fb9dea364b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Mon, 13 Oct 2008 12:56:16 +0000 Subject: [PATCH] - cleanup - remove dead ppc code - add support for probing hardware registers the way linux does (early, hook with VBR to trap faults) - detect MFPs this way. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28031 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/arch/m68k/arch_cpu.h | 4 + src/system/kernel/arch/m68k/arch_cpu_asm.S | 228 ++++++------------ .../kernel/platform/atari_m68k/platform.cpp | 24 +- 3 files changed, 89 insertions(+), 167 deletions(-) diff --git a/headers/private/kernel/arch/m68k/arch_cpu.h b/headers/private/kernel/arch/m68k/arch_cpu.h index d376a5f96b..cffda0fca1 100644 --- a/headers/private/kernel/arch/m68k/arch_cpu.h +++ b/headers/private/kernel/arch/m68k/arch_cpu.h @@ -436,6 +436,10 @@ extern void m68k_context_switch(void **_oldStackPointer, void *newStackPointer); extern bool m68k_set_fault_handler(addr_t *handlerLocation, addr_t handler) __attribute__((noinline)); +extern bool m68k_is_hw_register_readable(addr_t address); +extern bool m68k_is_hw_register_writable(addr_t address, uint16 value); + // defined in kernel: arch/m68k/cpu_asm.S + #ifdef __cplusplus } #endif diff --git a/src/system/kernel/arch/m68k/arch_cpu_asm.S b/src/system/kernel/arch/m68k/arch_cpu_asm.S index da2bec141b..5073dcf9b9 100644 --- a/src/system/kernel/arch/m68k/arch_cpu_asm.S +++ b/src/system/kernel/arch/m68k/arch_cpu_asm.S @@ -7,173 +7,83 @@ .text -#if 0 /* PPC stuff ahead... */ -/* uint32 get_sdr1(void); +.cpu 68020 + +/* + * Those two probe hardware register for presence, trapping bus errors. + * inspired by the Linux version, cf. + * http://lxr.linux.no/linux+v2.6.27/arch/m68k/mm/hwtest.c + * + * though I'm not sure why the tests are on words only. + * Some regs are bytes only and the even byte is unmapped... + * but probably ignored. */ -FUNCTION(get_sdr1): - mfsdr1 %r3 - blr -/* void set_sdr1(uint32 value); - * r3 +/* extern bool m68k_is_hw_register_readable(addr_t address); */ -FUNCTION(set_sdr1): - mtsdr1 %r3 - blr +FUNCTION(m68k_is_hw_register_readable): + /* a1: saved_vbr */ + /* save sp */ + move.l %sp,saved_sp + /* set our fault vector in the table */ + move.l #trap_fault_r,fault_vector -/* uint32 get_sr(void *virtualAddress); - * r3 + /* swap our table in */ + movec %vbr,%a1 + move.l #temp_vectors,%a0 + movec %a0,%vbr + + /* attempt the access */ + move.l 4(%sp),%a0 + moveq #0,%d0 + move.w (%a0),%d1 + + nop /* flush the pipeline */ + moveq #1,%d0 +trap_fault_r: + /* restore */ + movec %a1,%vbr + move.l saved_sp,%sp + rts +FUNCTION_END(m68k_is_hw_register_readable) + + +/* extern bool m68k_is_hw_register_writable(addr_t address, uint32 value); */ -FUNCTION(get_sr): - mfsrin %r3, %r3 - blr +FUNCTION(m68k_is_hw_register_writable): + /* a1: saved_vbr */ + /* save sp */ + move.l %sp,saved_sp + /* set our fault vector in the table */ + move.l #trap_fault_w,fault_vector -/* void set_sr(void *virtualAddress, uint32 value); - * r3 r4 - */ -FUNCTION(set_sr): - mtsrin %r4, %r3 - blr + /* swap our table in */ + movec %vbr,%a1 + move.l #temp_vectors,%a0 + movec %a0,%vbr -/* uint32 get_msr(void); - */ -FUNCTION(get_msr): - mfmsr %r3 - blr + /* attempt the access */ + move.l 4(%sp),%a0 + move.l 8(%sp),%d1 + moveq #0,%d0 + move.w %d1,(%a0) -/* uint32 set_msr(uint32 value); - * r3 - */ -FUNCTION(set_msr): - mtmsr %r3 - blr + nop /* flush the pipeline */ + moveq #1,%d0 +trap_fault_w: + /* restore */ + movec %a1,%vbr + move.l saved_sp,%sp + rts +FUNCTION_END(m68k_is_hw_register_writable) -/* uint32 get_pvr(void); - */ -FUNCTION(get_pvr): - mfpvr %r3 - blr +/* scratch data for the 2 functions above */ +saved_sp: + .long 0 +temp_vectors: + .long 0 /* reset sp */ + .long 0 /* reset pc */ +fault_vector: + .long 0 /* fault */ -#define get_ibat(num) \ - mfibatu %r4, num; \ - stw %r4, 0(%r3); \ - mfibatl %r4, num; \ - stw %r4, 4(%r3); \ - -#define set_ibat(num); \ - lwz %r4, 0(%r3); \ - mtibatu num, %r4; \ - lwz %r4, 4(%r3); \ - mtibatl num, %r4; - -/* void get_ibat0-3(block_address_translation *bat); - * r3 - */ -FUNCTION(get_ibat0): - get_ibat(0) - blr -FUNCTION(get_ibat1): - get_ibat(1) - blr -FUNCTION(get_ibat2): - get_ibat(2) - blr -FUNCTION(get_ibat3): - get_ibat(3) - blr - -/* void set_ibat0-3(block_address_translation *bat); - * r3 - */ -FUNCTION(set_ibat0): - set_ibat(0) - blr -FUNCTION(set_ibat1): - set_ibat(1) - blr -FUNCTION(set_ibat2): - set_ibat(2) - blr -FUNCTION(set_ibat3): - set_ibat(3) - blr - -/* void reset_ibats(void) - */ -FUNCTION(reset_ibats): - li %r3, 0 - mtibatu 0, %r3 - mtibatl 0, %r3 - mtibatu 1, %r3 - mtibatl 1, %r3 - mtibatu 2, %r3 - mtibatl 2, %r3 - mtibatu 3, %r3 - mtibatl 3, %r3 - blr - -#define get_dbat(num) \ - mfdbatu %r4, num; \ - stw %r4, 0(%r3); \ - mfdbatl %r4, num; \ - stw %r4, 4(%r3); - -#define set_dbat(num) \ - lwz %r4, 0(%r3); \ - mtdbatu num, %r4; \ - lwz %r4, 4(%r3); \ - mtdbatl num, %r4; - -/* void get_dbat0-3(block_address_translation *bat); - * r3 - */ -FUNCTION(get_dbat0): - get_dbat(0) - blr -FUNCTION(get_dbat1): - get_dbat(1) - blr -FUNCTION(get_dbat2): - get_dbat(2) - blr -FUNCTION(get_dbat3): - get_dbat(3) - blr - -/* void set_dbat0-3(block_address_translation *bat); - * r3 - */ -FUNCTION(set_dbat0): - set_dbat(0) - blr -FUNCTION(set_dbat1): - set_dbat(1) - blr -FUNCTION(set_dbat2): - set_dbat(2) - blr -FUNCTION(set_dbat3): - set_dbat(3) - blr - -/* void reset_dbats(void) - */ -FUNCTION(reset_dbats): - li %r3, 0 - mtdbatu 0, %r3 - mtdbatl 0, %r3 - mtdbatu 1, %r3 - mtdbatl 1, %r3 - mtdbatu 2, %r3 - mtdbatl 2, %r3 - mtdbatu 3, %r3 - mtdbatl 3, %r3 - blr - -/* void __eieio(void) - */ -FUNCTION(__eieio): - eieio - blr -#endif diff --git a/src/system/kernel/platform/atari_m68k/platform.cpp b/src/system/kernel/platform/atari_m68k/platform.cpp index df3b7eec4a..12b23c0137 100644 --- a/src/system/kernel/platform/atari_m68k/platform.cpp +++ b/src/system/kernel/platform/atari_m68k/platform.cpp @@ -85,6 +85,9 @@ public: uint32 Base() const { return fBase; }; int Vector() const { return fVector; }; + uint8 ReadReg(uint32 reg) { return in8(fBase + reg); }; + void WriteReg(uint32 reg, uint8 v) { out8(fBase + reg, v); }; + void EnableIOInterrupt(int irq); void DisableIOInterrupt(int irq); bool AcknowledgeIOInterrupt(int irq); @@ -261,6 +264,7 @@ M68KAtari::Init(struct kernel_args *kernelArgs) fMFP[0] = NULL; fMFP[1] = NULL; + // initialize ARAnyM NatFeatures nfGetID = kernelArgs->arch_args.plat_args.atari.nat_feat.nf_get_id; nfCall = @@ -268,6 +272,14 @@ M68KAtari::Init(struct kernel_args *kernelArgs) nfPage = (char *) kernelArgs->arch_args.plat_args.atari.nat_feat.nf_page; + // probe for hardware + if (m68k_is_hw_register_readable(MFP0_BASE)) + fMFP[0] = new(sMFP0Buffer) M68KAtari::MFP(MFP0_BASE, MFP0_VECTOR_BASE); + else + panic("You MUST have an ST MFP! Wait, is that *really* an Atari ???"); + if (m68k_is_hw_register_readable(MFP1_BASE)) + fMFP[1] = new(sMFP1Buffer) M68KAtari::MFP(MFP1_BASE, MFP1_VECTOR_BASE); + //} return B_OK; } @@ -304,10 +316,6 @@ M68KAtari::InitPostVM(struct kernel_args *kernelArgs) status_t M68KAtari::InitPIC(struct kernel_args *kernelArgs) { - fMFP[0] = new(sMFP0Buffer) M68KAtari::MFP(MFP0_BASE, MFP0_VECTOR_BASE); - //if (kernelArgs->arch_args.machine == /*TT*/) { - fMFP[1] = new(sMFP1Buffer) M68KAtari::MFP(MFP1_BASE, MFP1_VECTOR_BASE); - //} return B_NO_INIT; } @@ -326,7 +334,7 @@ status_t M68KAtari::InitTimer(struct kernel_args *kernelArgs) { - out8(fMFP[0]->Base() + MFP_TACR, 0); // stop it + fMFP[0]->WriteReg(MFP_TACR, 0); // stop it install_io_interrupt_handler(fMFP[0]->Vector()+13, &MFPTimerInterrupt, fMFP[0], 0); return B_OK; } @@ -547,15 +555,15 @@ M68KAtari::SetHardwareTimer(bigtime_t timeout) { uint8 counts = (uint8)(timeout & 0x0ff); //XXX: SCALE - out8(fMFP[0]->Base() + MFP_TADR, counts); - out8(fMFP[0]->Base() + MFP_TACR, 0x01); // delay mode, device by 4 + fMFP[0]->WriteReg(MFP_TADR, counts); + fMFP[0]->WriteReg(MFP_TACR, 0x01); // delay mode, device by 4 } void M68KAtari::ClearHardwareTimer(void) { - out8(fMFP[0]->Base() + MFP_TACR, 0); // stop it + fMFP[0]->WriteReg(MFP_TACR, 0); // stop it }