mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 06:07:34 +00:00
Kernel: Rename Thread::tss to Thread::regs and add x86_64 support
We're using software context switches so calling this struct tss is somewhat misleading.
This commit is contained in:
parent
eba33f82b8
commit
f285241cb8
14 changed files with 246 additions and 204 deletions
|
@ -597,7 +597,7 @@ KResult Process::do_exec(NonnullRefPtr<FileDescription> main_program_description
|
|||
auto make_stack_result = make_userspace_stack_for_main_thread(*load_result.stack_region.unsafe_ptr(), move(arguments), move(environment), move(auxv));
|
||||
if (make_stack_result.is_error())
|
||||
return make_stack_result.error();
|
||||
u32 new_userspace_esp = make_stack_result.value();
|
||||
FlatPtr new_userspace_esp = make_stack_result.value();
|
||||
|
||||
if (wait_for_tracer_at_next_execve()) {
|
||||
// Make sure we release the ptrace lock here or the tracer will block forever.
|
||||
|
@ -636,22 +636,21 @@ KResult Process::do_exec(NonnullRefPtr<FileDescription> main_program_description
|
|||
}
|
||||
new_main_thread->reset_fpu_state();
|
||||
|
||||
auto& regs = new_main_thread->m_regs;
|
||||
#if ARCH(I386)
|
||||
auto& tss = new_main_thread->m_tss;
|
||||
tss.cs = GDT_SELECTOR_CODE3 | 3;
|
||||
tss.ds = GDT_SELECTOR_DATA3 | 3;
|
||||
tss.es = GDT_SELECTOR_DATA3 | 3;
|
||||
tss.ss = GDT_SELECTOR_DATA3 | 3;
|
||||
tss.fs = GDT_SELECTOR_DATA3 | 3;
|
||||
tss.gs = GDT_SELECTOR_TLS | 3;
|
||||
tss.eip = load_result.entry_eip;
|
||||
tss.esp = new_userspace_esp;
|
||||
tss.cr3 = space().page_directory().cr3();
|
||||
tss.ss2 = pid().value();
|
||||
regs.cs = GDT_SELECTOR_CODE3 | 3;
|
||||
regs.ds = GDT_SELECTOR_DATA3 | 3;
|
||||
regs.es = GDT_SELECTOR_DATA3 | 3;
|
||||
regs.ss = GDT_SELECTOR_DATA3 | 3;
|
||||
regs.fs = GDT_SELECTOR_DATA3 | 3;
|
||||
regs.gs = GDT_SELECTOR_TLS | 3;
|
||||
regs.eip = load_result.entry_eip;
|
||||
regs.esp = new_userspace_esp;
|
||||
#else
|
||||
(void)new_userspace_esp;
|
||||
PANIC("Process::do_exec() not implemented");
|
||||
regs.rip = load_result.entry_eip;
|
||||
regs.rsp = new_userspace_esp;
|
||||
#endif
|
||||
regs.cr3 = space().page_directory().cr3();
|
||||
|
||||
{
|
||||
TemporaryChange profiling_disabler(m_profiling, was_profiling);
|
||||
|
|
|
@ -45,25 +45,26 @@ KResultOr<pid_t> Process::sys$fork(RegisterState& regs)
|
|||
child->space().set_enforces_syscall_regions(space().enforces_syscall_regions());
|
||||
|
||||
#if ARCH(I386)
|
||||
auto& child_tss = child_first_thread->m_tss;
|
||||
child_tss.eax = 0; // fork() returns 0 in the child :^)
|
||||
child_tss.ebx = regs.ebx;
|
||||
child_tss.ecx = regs.ecx;
|
||||
child_tss.edx = regs.edx;
|
||||
child_tss.ebp = regs.ebp;
|
||||
child_tss.esp = regs.userspace_esp;
|
||||
child_tss.esi = regs.esi;
|
||||
child_tss.edi = regs.edi;
|
||||
child_tss.eflags = regs.eflags;
|
||||
child_tss.eip = regs.eip;
|
||||
child_tss.cs = regs.cs;
|
||||
child_tss.ds = regs.ds;
|
||||
child_tss.es = regs.es;
|
||||
child_tss.fs = regs.fs;
|
||||
child_tss.gs = regs.gs;
|
||||
child_tss.ss = regs.userspace_ss;
|
||||
auto& child_regs = child_first_thread->m_regs;
|
||||
child_regs.eax = 0; // fork() returns 0 in the child :^)
|
||||
child_regs.ebx = regs.ebx;
|
||||
child_regs.ecx = regs.ecx;
|
||||
child_regs.edx = regs.edx;
|
||||
child_regs.ebp = regs.ebp;
|
||||
child_regs.esp = regs.userspace_esp;
|
||||
child_regs.esi = regs.esi;
|
||||
child_regs.edi = regs.edi;
|
||||
child_regs.eflags = regs.eflags;
|
||||
child_regs.eip = regs.eip;
|
||||
child_regs.cs = regs.cs;
|
||||
child_regs.ds = regs.ds;
|
||||
child_regs.es = regs.es;
|
||||
child_regs.fs = regs.fs;
|
||||
child_regs.gs = regs.gs;
|
||||
child_regs.ss = regs.userspace_ss;
|
||||
|
||||
dbgln_if(FORK_DEBUG, "fork: child will begin executing at {:04x}:{:08x} with stack {:04x}:{:08x}, kstack {:04x}:{:08x}", child_tss.cs, child_tss.eip, child_tss.ss, child_tss.esp, child_tss.ss0, child_tss.esp0);
|
||||
dbgln_if(FORK_DEBUG, "fork: child will begin executing at {:04x}:{:08x} with stack {:04x}:{:08x}, kstack {:04x}:{:08x}",
|
||||
child_regs.cs, child_regs.eip, child_regs.ss, child_regs.esp, child_regs.ss0, child_regs.esp0);
|
||||
#else
|
||||
(void)regs;
|
||||
PANIC("Process::sys$fork() not implemented.");
|
||||
|
|
|
@ -61,16 +61,17 @@ KResultOr<int> Process::sys$create_thread(void* (*entry)(void*), Userspace<const
|
|||
if (!is_thread_joinable)
|
||||
thread->detach();
|
||||
|
||||
auto& regs = thread->regs();
|
||||
#if ARCH(I386)
|
||||
auto& tss = thread->tss();
|
||||
tss.eip = (FlatPtr)entry;
|
||||
tss.eflags = 0x0202;
|
||||
tss.cr3 = space().page_directory().cr3();
|
||||
tss.esp = user_esp.value();
|
||||
regs.eip = (FlatPtr)entry;
|
||||
regs.eflags = 0x0202;
|
||||
regs.esp = user_esp.value();
|
||||
#else
|
||||
(void)entry;
|
||||
PANIC("Process::sys$create_thread() not implemented");
|
||||
regs.rip = (FlatPtr)entry;
|
||||
regs.rflags = 0x0202;
|
||||
regs.rsp = user_esp.value();
|
||||
#endif
|
||||
regs.cr3 = space().page_directory().cr3();
|
||||
|
||||
auto tsr_result = thread->make_thread_specific_region({});
|
||||
if (tsr_result.is_error())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue