diff --git a/Kernel/Arch/aarch64/ThreadRegisters.h b/Kernel/Arch/aarch64/ThreadRegisters.h index 2125f124f0..9d1f6b0c48 100644 --- a/Kernel/Arch/aarch64/ThreadRegisters.h +++ b/Kernel/Arch/aarch64/ThreadRegisters.h @@ -33,6 +33,14 @@ struct ThreadRegisters { set_ip(entry_ip); x[0] = entry_data; } + + void set_exec_state(FlatPtr entry_ip, FlatPtr userspace_sp, Memory::AddressSpace& space) + { + (void)entry_ip; + (void)userspace_sp; + (void)space; + TODO_AARCH64(); + } }; } diff --git a/Kernel/Arch/x86_64/ThreadRegisters.h b/Kernel/Arch/x86_64/ThreadRegisters.h index 84004f4abe..5ba62fdc84 100644 --- a/Kernel/Arch/x86_64/ThreadRegisters.h +++ b/Kernel/Arch/x86_64/ThreadRegisters.h @@ -79,6 +79,14 @@ struct ThreadRegisters { set_ip(entry_ip); rdi = entry_data; // entry function argument is expected to be in regs.rdi } + + void set_exec_state(FlatPtr entry_ip, FlatPtr userspace_sp, Memory::AddressSpace& space) + { + cs = GDT_SELECTOR_CODE3 | 3; + rip = entry_ip; + rsp = userspace_sp; + cr3 = space.page_directory().cr3(); + } }; } diff --git a/Kernel/Syscalls/execve.cpp b/Kernel/Syscalls/execve.cpp index b9020e86ab..3509235c76 100644 --- a/Kernel/Syscalls/execve.cpp +++ b/Kernel/Syscalls/execve.cpp @@ -685,10 +685,9 @@ ErrorOr Process::do_exec(NonnullLockRefPtr main_progr new_main_thread->reset_fpu_state(); auto& regs = new_main_thread->m_regs; - regs.cs = GDT_SELECTOR_CODE3 | 3; - regs.rip = load_result.entry_eip; - regs.rsp = new_userspace_sp; - regs.cr3 = address_space().with([](auto& space) { return space->page_directory().cr3(); }); + address_space().with([&](auto& space) { + regs.set_exec_state(load_result.entry_eip, new_userspace_sp, *space); + }); { TemporaryChange profiling_disabler(m_profiling, was_profiling);