[OpenBIOS] [PATCH 3/3] SPARC32: handle data faults for peek/poke
Bob Breuer
breuerr at mc.net
Mon Aug 12 03:06:58 CEST 2013
Signed-off-by: Bob Breuer <breuerr at mc.net>
---
openbios-devel/arch/sparc32/init.fs | 30 ++++++++++++++++++++++++++++++
openbios-devel/arch/sparc32/lib.c | 21 +++++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/openbios-devel/arch/sparc32/init.fs b/openbios-devel/arch/sparc32/init.fs
index e2cd571..814c720 100644
--- a/openbios-devel/arch/sparc32/init.fs
+++ b/openbios-devel/arch/sparc32/init.fs
@@ -46,6 +46,36 @@ device-end
0
;
+\ (peek) and (poke) implementation
+defer sfsr@
+defer ignore-dfault
+
+:noname
+ \ ( addr xt -- false | value true )
+ sfsr@ drop \ Clear any existing MMU fault status
+
+ -1 ignore-dfault ! \ Disable data fault trap
+ execute
+ 0 ignore-dfault ! \ Enable data fault trap
+
+ sfsr@ 0= if
+ true
+ else
+ drop false \ Failed, drop the read value
+ then
+; to (peek)
+
+:noname
+ \ ( value addr xt -- okay? )
+ sfsr@ drop \ Clear any existing MMU fault status
+
+ -1 ignore-dfault ! \ Disable data fault trap
+ execute
+ 0 ignore-dfault ! \ Enable data fault trap
+
+ sfsr@ 0= \ true if no fault
+; to (poke)
+
\ Load TCX FCode driver blob
[IFDEF] CONFIG_DRIVER_SBUS
-1 value tcx-driver-fcode
diff --git a/openbios-devel/arch/sparc32/lib.c b/openbios-devel/arch/sparc32/lib.c
index 81d30ad..a871b69 100644
--- a/openbios-devel/arch/sparc32/lib.c
+++ b/openbios-devel/arch/sparc32/lib.c
@@ -302,6 +302,22 @@ void obp_dumb_memfree(__attribute__((unused))char *va,
DPRINTF("obp_dumb_memfree 0x%p (size %d)\n", va, sz);
}
+extern unsigned int ignore_dfault;
+
+/* Data fault handling routines */
+
+/* ( -- reg ) */
+static void srmmu_get_sfsr(void)
+{
+ PUSH(srmmu_get_fstatus());
+}
+
+/* ( -- addr ) */
+static void ignore_dfault_addr(void)
+{
+ PUSH(pointer2cell(&ignore_dfault));
+}
+
void
ob_init_mmu(void)
{
@@ -360,6 +376,11 @@ ob_init_mmu(void)
bind_func("pgmap@", pgmap_fetch);
bind_func("pgmap!", pgmap_store);
bind_func("map-pages", ob_map_pages);
+
+ PUSH_xt( bind_noname_func(srmmu_get_sfsr) );
+ feval("to sfsr@");
+ PUSH_xt( bind_noname_func(ignore_dfault_addr) );
+ feval("to ignore-dfault");
}
/*
--
1.7.10.4
More information about the OpenBIOS
mailing list