From b759b7312e70b4b30b2fe4ebfa982f45bf71b6d4 Mon Sep 17 00:00:00 2001 From: Trung Nguyen <57174311+trungnt2910@users.noreply.github.com> Date: Tue, 5 Mar 2024 12:59:08 +0000 Subject: [PATCH] feat: Initial arm64 support This includes `monika_linux`, `haiku_loader`, and `hyclone_server`. `build_hprefix.sh` will not work yet since arm64 packages are not available on HaikuPorts yet. HPREFIXes themselves will also not work due to errors/stubs in Haiku's own `runtime_loader`. --- .gitignore | 4 +-- haiku_loader/sys/linux/loader_commpage.cpp | 6 +++++ libroot/libgcc_s.so.1 | Bin 104176 -> 0 bytes monika/linux/linux_syscall.S | 8 +++++- monika/linux/process.cpp | 4 +-- monika/linux/signal_conversion.cpp | 17 +++++++++++- monika/linux/signal_restore.S | 9 ++++++- runtime_loader/stl6c1j9 | 0 shared_headers/BeDefs.h | 8 +++++- shared_headers/arm64/arch_commpage_defs.h | 15 +++++++++++ shared_headers/arm64/arch_debugger.h | 16 ++++++++++++ shared_headers/arm64/arch_real_time_data.h | 20 ++++++++++++++ shared_headers/arm64/arch_signal.h | 29 +++++++++++++++++++++ 13 files changed, 128 insertions(+), 8 deletions(-) delete mode 100644 libroot/libgcc_s.so.1 delete mode 100644 runtime_loader/stl6c1j9 create mode 100644 shared_headers/arm64/arch_commpage_defs.h create mode 100644 shared_headers/arm64/arch_debugger.h create mode 100644 shared_headers/arm64/arch_real_time_data.h create mode 100644 shared_headers/arm64/arch_signal.h diff --git a/.gitignore b/.gitignore index 1358d8d..aa837aa 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,5 @@ build/** **/*.o **/*.a -**/*.so -**/haiku_include/** \ No newline at end of file +**/*.so* +**/haiku_include/** diff --git a/haiku_loader/sys/linux/loader_commpage.cpp b/haiku_loader/sys/linux/loader_commpage.cpp index 9f1cd6f..6266c01 100644 --- a/haiku_loader/sys/linux/loader_commpage.cpp +++ b/haiku_loader/sys/linux/loader_commpage.cpp @@ -50,6 +50,12 @@ void* loader_allocate_commpage() // Stubbed. realTimeData->arch_data.system_time_conversion_factor = 0; realTimeData->arch_data.system_time_offset = 0; +#elif defined(__aarch64__) + // Stubbed. + realTimeData->arch_data.data[0].system_time_offset = 0; + realTimeData->arch_data.data[1].system_time_offset = 0; + realTimeData->arch_data.system_time_conversion_factor = 0; + realTimeData->arch_data.version = 0; #else #warning commpage time data not set up for this architecture. #endif diff --git a/libroot/libgcc_s.so.1 b/libroot/libgcc_s.so.1 deleted file mode 100644 index a1495b52208cb5f5a75b647594c32ff41d59d4c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104176 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 DXE!-D diff --git a/monika/linux/linux_syscall.S b/monika/linux/linux_syscall.S index adaccc8..01820ff 100644 --- a/monika/linux/linux_syscall.S +++ b/monika/linux/linux_syscall.S @@ -35,8 +35,14 @@ linux_syscall: pop %ebx ret +#elif defined(__aarch64__) + + mov x8, x6 + svc 0 + ret + #else # error Missing assembly! -#endif \ No newline at end of file +#endif diff --git a/monika/linux/process.cpp b/monika/linux/process.cpp index ea3170d..78143af 100644 --- a/monika/linux/process.cpp +++ b/monika/linux/process.cpp @@ -2,9 +2,9 @@ #include "haiku_signal.h" #include -#include #include #include +#include #include #include "BeDefs.h" @@ -270,4 +270,4 @@ haiku_pid_t _moni_setsid() return result; } -} \ No newline at end of file +} diff --git a/monika/linux/signal_conversion.cpp b/monika/linux/signal_conversion.cpp index 5f31166..8d0c645 100644 --- a/monika/linux/signal_conversion.cpp +++ b/monika/linux/signal_conversion.cpp @@ -384,7 +384,22 @@ void ContextLinuxToB(const ucontext_t& linuxContext, haiku_ucontext_t& context) // TODO: floating point registers. memset(&context.uc_mcontext.fpu, 0, sizeof(context.uc_mcontext.fpu)); +#elif defined(__aarch64__) + for (int i = 0; i < 29; ++i) + { + context.uc_mcontext.x[i] = linuxContext.uc_mcontext.regs[i]; + } + context.uc_mcontext.lr = linuxContext.uc_mcontext.regs[30]; + context.uc_mcontext.sp = linuxContext.uc_mcontext.sp; + + // TODO: additional rocessor state + // https://elixir.bootlin.com/linux/latest/source/arch/arm64/include/uapi/asm/sigcontext.h + context.uc_mcontext.elr = 0; + context.uc_mcontext.spsr = 0; + memset(&context.uc_mcontext.fp_q, 0, sizeof(context.uc_mcontext.fp_q)); + context.uc_mcontext.fpsr = 0; + context.uc_mcontext.fpcr = 0; #else # error Implement mcontext_t marshalling on this platform! #endif -} \ No newline at end of file +} diff --git a/monika/linux/signal_restore.S b/monika/linux/signal_restore.S index 961d9a7..6e514de 100644 --- a/monika/linux/signal_restore.S +++ b/monika/linux/signal_restore.S @@ -22,8 +22,15 @@ __restore_rt: movl $173, %eax int $0x80 +#elif defined(__aarch64__) + +__restore: +__restore_rt: + mov x8,#139 // SYS_rt_sigreturn + svc 0 + #else # error Missing assembly! -#endif \ No newline at end of file +#endif diff --git a/runtime_loader/stl6c1j9 b/runtime_loader/stl6c1j9 deleted file mode 100644 index e69de29..0000000 diff --git a/shared_headers/BeDefs.h b/shared_headers/BeDefs.h index f65cb2f..dd57b45 100644 --- a/shared_headers/BeDefs.h +++ b/shared_headers/BeDefs.h @@ -11,6 +11,9 @@ typedef unsigned int uint32; typedef int64_t int64; typedef uint64_t uint64; +typedef volatile int32 vint32; +typedef volatile int64 vint64; + typedef unsigned char uchar; typedef int32 status_t; @@ -65,6 +68,9 @@ typedef long signed int haiku_ssize_t; #ifdef __x86_64__ #define B_PAGE_SIZE 4096 #define B_HAIKU_64_BIT 1 +#elif defined(__aarch64__) +#define B_PAGE_SIZE 4096 +#define B_HAIKU_64_BIT 1 #endif struct user_space_program_args @@ -101,4 +107,4 @@ enum | B_TIMEOUT_REAL_TIME_BASE }; -#endif // __HAIKU_STRUCTS_H__ \ No newline at end of file +#endif // __HAIKU_STRUCTS_H__ diff --git a/shared_headers/arm64/arch_commpage_defs.h b/shared_headers/arm64/arch_commpage_defs.h new file mode 100644 index 0000000..2d2fd25 --- /dev/null +++ b/shared_headers/arm64/arch_commpage_defs.h @@ -0,0 +1,15 @@ +/* + * Copyright 2019 Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + */ + +#ifndef _SYSTEM_ARCH_ARM64_COMMPAGE_DEFS_H +#define _SYSTEM_ARCH_ARM64_COMMPAGE_DEFS_H + +#ifndef _SYSTEM_COMMPAGE_DEFS_H +# error Must not be included directly. Include instead! +#endif + +#define COMMPAGE_ENTRY_ARM64_THREAD_EXIT (COMMPAGE_ENTRY_FIRST_ARCH_SPECIFIC + 0) + +#endif /* _SYSTEM_ARCH_ARM64_COMMPAGE_DEFS_H */ diff --git a/shared_headers/arm64/arch_debugger.h b/shared_headers/arm64/arch_debugger.h new file mode 100644 index 0000000..0f2487f --- /dev/null +++ b/shared_headers/arm64/arch_debugger.h @@ -0,0 +1,16 @@ +/* + * Copyright 2019 Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef _ARCH_ARM64_DEBUGGER_H +#define _ARCH_ARM64_DEBUGGER_H + +struct arm64_debug_cpu_state { + unsigned long x[30]; + unsigned long lr; + unsigned long sp; + unsigned long elr; + unsigned int spsr; +} __attribute__((aligned(16))); + +#endif // _ARCH_ARM_DEBUGGER_H diff --git a/shared_headers/arm64/arch_real_time_data.h b/shared_headers/arm64/arch_real_time_data.h new file mode 100644 index 0000000..16ec433 --- /dev/null +++ b/shared_headers/arm64/arch_real_time_data.h @@ -0,0 +1,20 @@ +/* + * Copyright 2019 Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef _KERNEL_ARCH_REAL_TIME_DATA_H +#define _KERNEL_ARCH_REAL_TIME_DATA_H + +#include "BeDefs.h" + +struct arm64_real_time_data { + vint64 system_time_offset; +}; + +struct arch_real_time_data { + struct arm64_real_time_data data[2]; + vint32 system_time_conversion_factor; + vint32 version; +}; + +#endif /* _KERNEL_ARCH_REAL_TIME_DATA_H */ diff --git a/shared_headers/arm64/arch_signal.h b/shared_headers/arm64/arch_signal.h new file mode 100644 index 0000000..5d7bf96 --- /dev/null +++ b/shared_headers/arm64/arch_signal.h @@ -0,0 +1,29 @@ +/* + * Copyright 2019 Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + */ + +#ifndef _ARCH_ARM64_SIGNAL_H_ +#define _ARCH_ARM64_SIGNAL_H_ + + +/* + * Architecture-specific structure passed to signal handlers + */ + +#if defined(__aarch64__) +struct vregs +{ + unsigned long x[30]; + unsigned long lr; + unsigned long sp; + unsigned long elr; + unsigned long spsr; + __uint128_t fp_q[32]; + unsigned int fpsr; + unsigned int fpcr; +}; +#endif /* defined(__aarch64__) */ + + +#endif /* _ARCH_ARM64_SIGNAL_H_ */