diff --git a/Kernel/Arch/aarch64/ThreadRegisters.h b/Kernel/Arch/aarch64/ThreadRegisters.h index 540b588693..a3fffaeaa7 100644 --- a/Kernel/Arch/aarch64/ThreadRegisters.h +++ b/Kernel/Arch/aarch64/ThreadRegisters.h @@ -25,6 +25,12 @@ struct ThreadRegisters { { set_sp(kernel_stack_top); } + + void set_entry_function(FlatPtr entry_ip, FlatPtr entry_data) + { + set_ip(entry_ip); + x[0] = entry_data; + } }; } diff --git a/Kernel/Arch/x86_64/ThreadRegisters.h b/Kernel/Arch/x86_64/ThreadRegisters.h index 921b2eb610..84004f4abe 100644 --- a/Kernel/Arch/x86_64/ThreadRegisters.h +++ b/Kernel/Arch/x86_64/ThreadRegisters.h @@ -73,6 +73,12 @@ struct ThreadRegisters { set_sp0(kernel_stack_top); } } + + void set_entry_function(FlatPtr entry_ip, FlatPtr entry_data) + { + set_ip(entry_ip); + rdi = entry_data; // entry function argument is expected to be in regs.rdi + } }; } diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 73e0ff94f3..51bb92217d 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -273,15 +273,7 @@ LockRefPtr Process::create_kernel_process(LockRefPtr& first_thr return {}; auto process = process_or_error.release_value(); - first_thread->regs().set_ip((FlatPtr)entry); -#if ARCH(X86_64) - first_thread->regs().rdi = FlatPtr(entry_data); // entry function argument is expected to be in regs.rdi -#elif ARCH(AARCH64) - (void)entry_data; - TODO_AARCH64(); -#else -# error Unknown architecture -#endif + first_thread->regs().set_entry_function((FlatPtr)entry, (FlatPtr)entry_data); if (do_register == RegisterProcess::Yes) register_new(*process);