summaryrefslogtreecommitdiff
path: root/emu
diff options
context:
space:
mode:
Diffstat (limited to 'emu')
-rw-r--r--emu/NetBSD/asm-arm.S78
-rw-r--r--emu/NetBSD/mkfile1
-rw-r--r--emu/NetBSD/segflush-arm.c19
3 files changed, 98 insertions, 0 deletions
diff --git a/emu/NetBSD/asm-arm.S b/emu/NetBSD/asm-arm.S
new file mode 100644
index 00000000..afaa5479
--- /dev/null
+++ b/emu/NetBSD/asm-arm.S
@@ -0,0 +1,78 @@
+#include <machine/asm.h>
+
+/*
+ * ulong _tas(ulong*);
+ */
+#if __ARM_ARCH >= 6
+
+#if __ARM_ARCH >= 7
+#define DMB dmb
+#else
+#define DMB mcr p15, 0, r0, c7, c10, 5
+#endif
+
+ENTRY(_tas)
+ @ args = 0, pretend = 0, frame = 0
+ @ frame_needed = 0, uses_anonymous_args = 0
+ @ link register save eliminated.
+ @ lr needed for prologue
+ DMB
+ mov r1, r0
+ mov r2, #0xaa
+.Loop:
+ ldrex r0, [r1]
+ cmp r0, #0
+ bne .Lockbusy
+ strex r3, r2, [r1]
+ cmp r3, #0
+ bne .Loop
+ DMB
+ bx lr
+.Lockbusy:
+ clrex
+ bx lr
+ END(_tas)
+
+#else /* __ARM_ARCH <= 5*/
+
+ENTRY(_tas)
+ @ args = 0, pretend = 0, frame = 0
+ @ frame_needed = 0, uses_anonymous_args = 0
+ @ link register save eliminated.
+ @ lr needed for prologue
+ mov r3, #1
+ mov r1, r0
+ swp r0, r3, [r1]
+ bx lr
+ END(_tas)
+
+#endif /* __ARM_ARCH <= 5*/
+
+
+/*
+ * void FPsave(void *);
+ */
+ENTRY(FPsave)
+ @ args = 0, pretend = 0, frame = 4
+ @ frame_needed = 1, uses_anonymous_args = 0
+ mov ip, sp
+ stmfd sp!, {fp, ip, lr, pc}
+ sub fp, ip, #4
+ sub sp, sp, #4
+ str r0, [fp, #-16]
+ ldmea fp, {fp, sp, pc}
+ END(FPsave)
+
+/*
+ * void FPrestore(void *);
+ */
+ENTRY(FPrestore)
+ @ args = 0, pretend = 0, frame = 4
+ @ frame_needed = 1, uses_anonymous_args = 0
+ mov ip, sp
+ stmfd sp!, {fp, ip, lr, pc}
+ sub fp, ip, #4
+ sub sp, sp, #4
+ str r0, [fp, #-16]
+ ldmea fp, {fp, sp, pc}
+ END(FPrestore)
diff --git a/emu/NetBSD/mkfile b/emu/NetBSD/mkfile
index 17516997..6a9b6a5c 100644
--- a/emu/NetBSD/mkfile
+++ b/emu/NetBSD/mkfile
@@ -40,6 +40,7 @@ default:V: $O.$CONF
$O.$CONF: $OBJ $CONF.c $CONF.root.h $LIBFILES
$CC $CFLAGS '-DKERNDATE='$KERNDATE $CONF.c
$LD $LDFLAGS -o $target $OBJ $CONF.$O $LIBFILES $SYSLIBS
+ $PAXCTL $target
install:V: $O.$CONF
cp $O.$CONF $INSTALLDIR/$CONF
diff --git a/emu/NetBSD/segflush-arm.c b/emu/NetBSD/segflush-arm.c
new file mode 100644
index 00000000..a03b438b
--- /dev/null
+++ b/emu/NetBSD/segflush-arm.c
@@ -0,0 +1,19 @@
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <machine/sysarch.h>
+
+#include "dat.h"
+
+
+int
+segflush(void *a, ulong n)
+{
+ struct arm_sync_icache_args args;
+
+ mprotect(a, (size_t)n, PROT_READ | PROT_WRITE | PROT_EXEC);
+
+ args.addr = (uintptr_t)a;
+ args.len = (size_t)n;
+ sysarch(ARM_SYNC_ICACHE, (void *)&args);
+ return 0;
+}