arm64: Add userspace entry wiring.

Change-Id: I53ecd2208e1c29271f85396d01c63509705ee840
Reviewed-on: https://review.haiku-os.org/c/haiku/+/5266
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
milek7
2022-07-14 07:09:02 +00:00
committed by Adrien Destugues
parent 9d80098e24
commit 07c6982fa6
@@ -8,6 +8,7 @@
#include <arch_cpu.h> #include <arch_cpu.h>
#include <arch/thread.h> #include <arch/thread.h>
#include <boot/stage2.h> #include <boot/stage2.h>
#include <commpage_defs.h>
#include <kernel.h> #include <kernel.h>
#include <thread.h> #include <thread.h>
#include <tls.h> #include <tls.h>
@@ -74,16 +75,41 @@ arch_thread_context_switch(Thread *from, Thread *to)
_arch_context_swap(&from->arch_info, &to->arch_info); _arch_context_swap(&from->arch_info, &to->arch_info);
} }
void void
arch_thread_dump_info(void *info) arch_thread_dump_info(void *info)
{ {
} }
extern "C" void _eret_with_iframe(iframe *frame);
status_t status_t
arch_thread_enter_userspace(Thread *thread, addr_t entry, arch_thread_enter_userspace(Thread *thread, addr_t entry,
void *arg1, void *arg2) void *arg1, void *arg2)
{ {
addr_t threadExitAddr;
{
addr_t commpageAdr = (addr_t)thread->team->commpage_address;
status_t ret = user_memcpy(&threadExitAddr,
&((addr_t*)commpageAdr)[COMMPAGE_ENTRY_ARM64_THREAD_EXIT],
sizeof(threadExitAddr));
ASSERT(ret == B_OK);
threadExitAddr += commpageAdr;
}
iframe frame;
memset(&frame, 0, sizeof(frame));
frame.spsr = 0;
frame.elr = entry;
frame.x[0] = (uint64_t)arg1;
frame.x[1] = (uint64_t)arg2;
frame.lr = threadExitAddr;
frame.sp = thread->user_stack_base + thread->user_stack_size;
_eret_with_iframe(&frame);
return B_ERROR; return B_ERROR;
} }
@@ -99,6 +125,7 @@ status_t
arch_setup_signal_frame(Thread *thread, struct sigaction *sa, arch_setup_signal_frame(Thread *thread, struct sigaction *sa,
struct signal_frame_data *signalFrameData) struct signal_frame_data *signalFrameData)
{ {
panic("arch_setup_signal_frame");
return B_ERROR; return B_ERROR;
} }
@@ -119,6 +146,7 @@ arch_check_syscall_restart(Thread *thread)
void void
arch_store_fork_frame(struct arch_fork_arg *arg) arch_store_fork_frame(struct arch_fork_arg *arg)
{ {
panic("arch_store_fork_frame");
} }