From e89e8a1559693b91fd201d2a0368a8561c1473b7 Mon Sep 17 00:00:00 2001 From: Valery Ushakov Date: Tue, 29 Dec 2020 20:10:33 +0300 Subject: NetBSD/arm: initial support This is more or less mechanical merge of existing NetBSD code and ARM-specific bits from Linux/arm files. --- emu/NetBSD/asm-arm.S | 78 +++++++++++++++++++++++++++++++++++++++++++++++ emu/NetBSD/segflush-arm.c | 16 ++++++++++ 2 files changed, 94 insertions(+) create mode 100644 emu/NetBSD/asm-arm.S create mode 100644 emu/NetBSD/segflush-arm.c (limited to 'emu/NetBSD') diff --git a/emu/NetBSD/asm-arm.S b/emu/NetBSD/asm-arm.S new file mode 100644 index 00000000..02e37396 --- /dev/null +++ b/emu/NetBSD/asm-arm.S @@ -0,0 +1,78 @@ +#include + +/* + * 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 +tas1: + ldrex r0, [r1] + cmp r0, #0 + bne lockbusy + strex r3, r2, [r1] + cmp r3, #0 + bne tas1 + 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/segflush-arm.c b/emu/NetBSD/segflush-arm.c new file mode 100644 index 00000000..f4529633 --- /dev/null +++ b/emu/NetBSD/segflush-arm.c @@ -0,0 +1,16 @@ +#include +#include + +#include "dat.h" + + +int +segflush(void *a, ulong n) +{ + struct arm_sync_icache_args args; + + args.addr = (uintptr_t)a; + args.len = (size_t)n; + sysarch(ARM_SYNC_ICACHE, (void *)&args); + return 0; +} -- cgit v1.2.3 From c5728686379484100b7d59abf4f0b47928b1631e Mon Sep 17 00:00:00 2001 From: Valery Ushakov Date: Tue, 29 Dec 2020 20:21:00 +0300 Subject: NetBSD/asm-arm.S: use .L for local labels. --- emu/NetBSD/asm-arm.S | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'emu/NetBSD') diff --git a/emu/NetBSD/asm-arm.S b/emu/NetBSD/asm-arm.S index 02e37396..afaa5479 100644 --- a/emu/NetBSD/asm-arm.S +++ b/emu/NetBSD/asm-arm.S @@ -19,16 +19,16 @@ ENTRY(_tas) DMB mov r1, r0 mov r2, #0xaa -tas1: +.Loop: ldrex r0, [r1] cmp r0, #0 - bne lockbusy + bne .Lockbusy strex r3, r2, [r1] cmp r3, #0 - bne tas1 + bne .Loop DMB bx lr -lockbusy: +.Lockbusy: clrex bx lr END(_tas) -- cgit v1.2.3 From 8adc601ba8dfd68676fc702cd30075643967f2fd Mon Sep 17 00:00:00 2001 From: Valery Ushakov Date: Mon, 4 Jan 2021 02:42:43 +0300 Subject: NetBSD/arm: disable pax mprotect restrictions for emu ARM has separate read and execute protection bits so after writing out JIT code we need to make it executable with mprotect(2), but PAX wouldn't let us by default. Mark the emu binary so that this restriction is lifted. On other machines where this is not an issue set PAXCTL to a no-op. --- emu/NetBSD/mkfile | 1 + mkfiles/mkfile-NetBSD-386 | 2 ++ mkfiles/mkfile-NetBSD-arm | 3 +++ mkfiles/mkfile-NetBSD-power | 2 ++ 4 files changed, 8 insertions(+) (limited to 'emu/NetBSD') 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/mkfiles/mkfile-NetBSD-386 b/mkfiles/mkfile-NetBSD-386 index 99ae6687..39e8ed5d 100644 --- a/mkfiles/mkfile-NetBSD-386 +++ b/mkfiles/mkfile-NetBSD-386 @@ -26,5 +26,7 @@ LDFLAGS= SYSLIBS= +PAXCTL= : + YACC= iyacc YFLAGS= -d diff --git a/mkfiles/mkfile-NetBSD-arm b/mkfiles/mkfile-NetBSD-arm index a022c05b..581bca9d 100644 --- a/mkfiles/mkfile-NetBSD-arm +++ b/mkfiles/mkfile-NetBSD-arm @@ -26,5 +26,8 @@ LDFLAGS= SYSLIBS= +# disable PaX mprotect(2) restrictions for JIT +PAXCTL= paxctl +m + YACC= iyacc YFLAGS= -d diff --git a/mkfiles/mkfile-NetBSD-power b/mkfiles/mkfile-NetBSD-power index 1ac7e58e..ae7f86c8 100644 --- a/mkfiles/mkfile-NetBSD-power +++ b/mkfiles/mkfile-NetBSD-power @@ -26,5 +26,7 @@ LDFLAGS= SYSLIBS= +PAXCTL= : + YACC= iyacc YFLAGS= -d -- cgit v1.2.3 From e273317811820976dda632b0893960646d6e1119 Mon Sep 17 00:00:00 2001 From: Valery Ushakov Date: Mon, 4 Jan 2021 03:00:19 +0300 Subject: NetBSD/arm: segflush - use mprotect to add PROT_EXEC ARM has separate read and execute protection bits so after writing out JIT code we need to make it executable. --- emu/NetBSD/segflush-arm.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'emu/NetBSD') diff --git a/emu/NetBSD/segflush-arm.c b/emu/NetBSD/segflush-arm.c index f4529633..a03b438b 100644 --- a/emu/NetBSD/segflush-arm.c +++ b/emu/NetBSD/segflush-arm.c @@ -1,4 +1,5 @@ #include +#include #include #include "dat.h" @@ -9,6 +10,8 @@ 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); -- cgit v1.2.3