From e9d04b25e6b1e8b4d84f6354f3f737e3e7b74446 Mon Sep 17 00:00:00 2001 From: milek7 Date: Thu, 28 Apr 2022 22:01:39 +0200 Subject: [PATCH] arm64: Add thread exit syscall in commpage. Change-Id: Ia8e7e4626add623735fefefa1af151b7338adc35 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5265 Reviewed-by: Adrien Destugues Reviewed-by: waddlesplash Tested-by: Commit checker robot --- .../system/arch/arm64/arch_commpage_defs.h | 2 ++ src/system/kernel/arch/arm64/arch_asm.S | 5 ++++ .../kernel/arch/arm64/arch_commpage.cpp | 30 +++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/headers/private/system/arch/arm64/arch_commpage_defs.h b/headers/private/system/arch/arm64/arch_commpage_defs.h index 0df827662c..2d2fd2502c 100644 --- a/headers/private/system/arch/arm64/arch_commpage_defs.h +++ b/headers/private/system/arch/arm64/arch_commpage_defs.h @@ -10,4 +10,6 @@ # 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/src/system/kernel/arch/arm64/arch_asm.S b/src/system/kernel/arch/arm64/arch_asm.S index c71934e659..fae109f4e1 100644 --- a/src/system/kernel/arch/arm64/arch_asm.S +++ b/src/system/kernel/arch/arm64/arch_asm.S @@ -5,9 +5,14 @@ #include #include #include "asm_offsets.h" +#include "syscall_numbers.h" .text +FUNCTION(_thread_exit_syscall): + svc #((SYSCALL_EXIT_THREAD << 5) | 1) +FUNCTION_END(_thread_exit_syscall) + .macro xchg_sp xt add sp, sp, \xt sub \xt, sp, \xt diff --git a/src/system/kernel/arch/arm64/arch_commpage.cpp b/src/system/kernel/arch/arm64/arch_commpage.cpp index ab032ac152..2e9cf151d0 100644 --- a/src/system/kernel/arch/arm64/arch_commpage.cpp +++ b/src/system/kernel/arch/arm64/arch_commpage.cpp @@ -13,6 +13,33 @@ #include +extern "C" void _thread_exit_syscall(); + + +static void +register_commpage_function(const char* functionName, int32 commpageIndex, + const char* commpageSymbolName, addr_t expectedAddress) +{ + // get address and size of function + elf_symbol_info symbolInfo; + if (elf_lookup_kernel_symbol(functionName, &symbolInfo) != B_OK) { + panic("register_commpage_function(): Failed to find signal frame function \"%s\"!", + functionName); + } + + ASSERT(expectedAddress == symbolInfo.address); + + // fill in the commpage table entry + addr_t position = fill_commpage_entry(commpageIndex, (void*)symbolInfo.address, + symbolInfo.size); + + // add symbol to the commpage image + image_id image = get_commpage_image(); + elf_add_memory_image_symbol(image, commpageSymbolName, position, symbolInfo.size, + B_SYMBOL_TYPE_TEXT); +} + + status_t arch_commpage_init(void) { @@ -23,5 +50,8 @@ arch_commpage_init(void) status_t arch_commpage_init_post_cpus(void) { + register_commpage_function("_thread_exit_syscall", COMMPAGE_ENTRY_ARM64_THREAD_EXIT, + "commpage_thread_exit", (addr_t)&_thread_exit_syscall); + return B_OK; }