From 89a9637abf4398b3c22050eaf86fa9f16aab37b9 Mon Sep 17 00:00:00 2001 From: Miod Vallat Date: Sat, 18 Nov 2006 22:58:29 +0000 Subject: On 88100 systems which do not need the xxx.usr instruction workaround, override the DAE helper routines with workaroundless code while the kernel text is still writable. --- sys/arch/luna88k/luna88k/machdep.c | 4 +++- sys/arch/m88k/include/m88100.h | 20 +++++++++++--------- sys/arch/m88k/m88k/m88100_machdep.c | 36 ++++++++++++++++++++++++++++++++++-- sys/arch/mvme88k/mvme88k/machdep.c | 11 ++++++++++- 4 files changed, 58 insertions(+), 13 deletions(-) (limited to 'sys') diff --git a/sys/arch/luna88k/luna88k/machdep.c b/sys/arch/luna88k/luna88k/machdep.c index 2991ee82ffc..fd43ad9270f 100644 --- a/sys/arch/luna88k/luna88k/machdep.c +++ b/sys/arch/luna88k/luna88k/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.34 2006/10/30 14:46:35 aoyama Exp $ */ +/* $OpenBSD: machdep.c,v 1.35 2006/11/18 22:58:25 miod Exp $ */ /* * Copyright (c) 1998, 1999, 2000, 2001 Steve Murphree, Jr. * Copyright (c) 1996 Nivas Madhur @@ -1096,6 +1096,8 @@ luna88k_bootstrap() master_cpu = cmmu_init(); set_cpu_number(master_cpu); + m88100_apply_patches(); + /* * On the luna88k, secondary processors are not disabled while the * kernel is initializing. We just initialized the CMMUs tied to the diff --git a/sys/arch/m88k/include/m88100.h b/sys/arch/m88k/include/m88100.h index 1b56d2f26d2..53180beb2e2 100644 --- a/sys/arch/m88k/include/m88100.h +++ b/sys/arch/m88k/include/m88100.h @@ -1,4 +1,4 @@ -/* $OpenBSD: m88100.h,v 1.2 2004/08/01 17:18:05 miod Exp $ */ +/* $OpenBSD: m88100.h,v 1.3 2006/11/18 22:58:28 miod Exp $ */ /* * Mach Operating System * Copyright (c) 1993-1992 Carnegie Mellon University @@ -57,19 +57,21 @@ #define DMT_ENBITS(x) (((x) & DMT_EN) >> DMT_ENSHIFT) #if defined(_KERNEL) && !defined(_LOCORE) -void dae_print(unsigned *eframe); -void data_access_emulation(unsigned *eframe); + +void dae_print(unsigned *); +void data_access_emulation(unsigned *); u_int32_t do_load_word(vaddr_t, int); u_int16_t do_load_half(vaddr_t, int); -u_int8_t do_load_byte(vaddr_t, int); +u_int8_t do_load_byte(vaddr_t, int); +void do_store_word(vaddr_t, u_int32_t, int); +void do_store_half(vaddr_t, u_int16_t, int); +void do_store_byte(vaddr_t, u_int8_t, int); +u_int32_t do_xmem_word(vaddr_t, u_int32_t, int); +u_int8_t do_xmem_byte(vaddr_t, u_int8_t, int); -void do_store_word(vaddr_t, u_int32_t, int); -void do_store_half(vaddr_t, u_int16_t, int); -void do_store_byte(vaddr_t, u_int8_t, int); +void m88100_apply_patches(void); -u_int32_t do_xmem_word(vaddr_t, u_int32_t, int); -u_int8_t do_xmem_byte(vaddr_t, u_int8_t, int); #endif #endif /* __M88K_M88100_H__ */ diff --git a/sys/arch/m88k/m88k/m88100_machdep.c b/sys/arch/m88k/m88k/m88100_machdep.c index c0cbb795d4c..61a1bef371c 100644 --- a/sys/arch/m88k/m88k/m88100_machdep.c +++ b/sys/arch/m88k/m88k/m88100_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: m88100_machdep.c,v 1.1 2004/08/01 17:18:05 miod Exp $ */ +/* $OpenBSD: m88100_machdep.c,v 1.2 2006/11/18 22:58:28 miod Exp $ */ /* * Mach Operating System * Copyright (c) 1993-1991 Carnegie Mellon University @@ -31,10 +31,11 @@ #include #include +#include #include /* - * data access emulation for M88100 exceptions + * Data Access Emulation for M88100 exceptions */ #define DMT_BYTE 1 @@ -260,3 +261,34 @@ data_access_emulation(unsigned *eframe) } eframe[EF_DMT0] = 0; } + +/* + * Routines to patch the kernel code on 88100 systems not affected by + * the xxx.usr bug. + */ + +void +m88100_apply_patches() +{ +#ifdef ERRATA__XXX_USR + if (((get_cpu_pid() & PID_VN) >> VN_SHIFT) >= 2) { + /* + * Patch DAE helpers. + * before after + * branch branch + * NOP jmp.n r1 + * xxx.usr xxx.usr + * NOP; NOP; NOP + * jmp r1 + */ + ((u_int32_t *)(do_load_word))[1] = 0xf400c401; + ((u_int32_t *)(do_load_half))[1] = 0xf400c401; + ((u_int32_t *)(do_load_byte))[1] = 0xf400c401; + ((u_int32_t *)(do_store_word))[1] = 0xf400c401; + ((u_int32_t *)(do_store_half))[1] = 0xf400c401; + ((u_int32_t *)(do_store_byte))[1] = 0xf400c401; + ((u_int32_t *)(do_xmem_word))[1] = 0xf400c401; + ((u_int32_t *)(do_xmem_byte))[1] = 0xf400c401; + } +#endif +} diff --git a/sys/arch/mvme88k/mvme88k/machdep.c b/sys/arch/mvme88k/mvme88k/machdep.c index b6b8d2270dd..3bdd8849c79 100644 --- a/sys/arch/mvme88k/mvme88k/machdep.c +++ b/sys/arch/mvme88k/mvme88k/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.184 2006/07/07 19:36:56 miod Exp $ */ +/* $OpenBSD: machdep.c,v 1.185 2006/11/18 22:58:28 miod Exp $ */ /* * Copyright (c) 1998, 1999, 2000, 2001 Steve Murphree, Jr. * Copyright (c) 1996 Nivas Madhur @@ -74,6 +74,9 @@ #include #include #include +#ifdef M88100 +#include +#endif #include @@ -1043,6 +1046,12 @@ mvme_bootstrap() master_cpu = cmmu_init(); set_cpu_number(master_cpu); +#ifdef M88100 + if (CPU_IS88100) { + m88100_apply_patches(); + } +#endif + /* * Now that set_cpu_number() set us with a valid cpu_info pointer, * we need to initialize p_addr and curpcb before autoconf, for the -- cgit v1.2.3