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