Skip to content

Commit a3cbaa3

Browse files
FireFox317ADKaster
authored andcommitted
Kernel: Move ThreadRegisters into arch-specific directory
These are architecture-specific anyway, so they belong in the Arch directory. This commit also adds ThreadRegisters::set_initial_state to factor out the logic in Thread.cpp.
1 parent 0d2dffb commit a3cbaa3

File tree

6 files changed

+133
-75
lines changed

6 files changed

+133
-75
lines changed

Kernel/Arch/ThreadRegisters.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright (c) 2022, Timon Kruiper <timonkruiper@gmail.com>
3+
*
4+
* SPDX-License-Identifier: BSD-2-Clause
5+
*/
6+
7+
#pragma once
8+
9+
#include <AK/Platform.h>
10+
11+
#if ARCH(X86_64)
12+
# include <Kernel/Arch/x86_64/ThreadRegisters.h>
13+
#elif ARCH(AARCH64)
14+
# include <Kernel/Arch/aarch64/ThreadRegisters.h>
15+
#else
16+
# error "Unknown architecture"
17+
#endif
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright (c) 2022, Timon Kruiper <timonkruiper@gmail.com>
3+
*
4+
* SPDX-License-Identifier: BSD-2-Clause
5+
*/
6+
7+
#pragma once
8+
9+
#include <AK/Types.h>
10+
#include <Kernel/Memory/AddressSpace.h>
11+
12+
namespace Kernel {
13+
14+
struct ThreadRegisters {
15+
u64 x[31];
16+
u64 elr_el1;
17+
u64 sp_el0;
18+
19+
FlatPtr ip() const { return elr_el1; }
20+
void set_ip(FlatPtr value) { elr_el1 = value; }
21+
22+
void set_sp(FlatPtr value) { sp_el0 = value; }
23+
24+
void set_initial_state(bool, Memory::AddressSpace&, FlatPtr kernel_stack_top)
25+
{
26+
set_sp(kernel_stack_top);
27+
}
28+
};
29+
30+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Copyright (c) 2021, Gunnar Beutner <gbeutner@serenityos.org>
3+
*
4+
* SPDX-License-Identifier: BSD-2-Clause
5+
*/
6+
7+
#pragma once
8+
9+
#include <AK/Platform.h>
10+
#include <AK/Types.h>
11+
#include <Kernel/Memory/AddressSpace.h>
12+
13+
namespace Kernel {
14+
15+
struct ThreadRegisters {
16+
FlatPtr rdi;
17+
FlatPtr rsi;
18+
FlatPtr rbp;
19+
FlatPtr rsp;
20+
FlatPtr rbx;
21+
FlatPtr rdx;
22+
FlatPtr rcx;
23+
FlatPtr rax;
24+
FlatPtr r8;
25+
FlatPtr r9;
26+
FlatPtr r10;
27+
FlatPtr r11;
28+
FlatPtr r12;
29+
FlatPtr r13;
30+
FlatPtr r14;
31+
FlatPtr r15;
32+
FlatPtr rip;
33+
FlatPtr rsp0;
34+
FlatPtr cs;
35+
36+
FlatPtr rflags;
37+
FlatPtr flags() const { return rflags; }
38+
void set_flags(FlatPtr value) { rflags = value; }
39+
void set_sp(FlatPtr value) { rsp = value; }
40+
void set_sp0(FlatPtr value) { rsp0 = value; }
41+
void set_ip(FlatPtr value) { rip = value; }
42+
43+
FlatPtr cr3;
44+
45+
FlatPtr ip() const
46+
{
47+
return rip;
48+
}
49+
50+
FlatPtr sp() const
51+
{
52+
return rsp;
53+
}
54+
55+
void set_initial_state(bool is_kernel_process, Memory::AddressSpace& space, FlatPtr kernel_stack_top)
56+
{
57+
// Only IF is set when a process boots.
58+
set_flags(0x0202);
59+
60+
if (is_kernel_process)
61+
cs = GDT_SELECTOR_CODE0;
62+
else
63+
cs = GDT_SELECTOR_CODE3 | 3;
64+
65+
cr3 = space.page_directory().cr3();
66+
67+
if (is_kernel_process) {
68+
set_sp(kernel_stack_top);
69+
set_sp0(kernel_stack_top);
70+
} else {
71+
// Ring 3 processes get a separate stack for ring 0.
72+
// The ring 3 stack will be assigned by exec().
73+
set_sp0(kernel_stack_top);
74+
}
75+
}
76+
};
77+
78+
}

Kernel/Syscalls/thread.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,17 @@ ErrorOr<FlatPtr> Process::sys$create_thread(void* (*entry)(void*), Userspace<Sys
5555

5656
auto& regs = thread->regs();
5757
regs.set_ip((FlatPtr)entry);
58-
regs.set_flags(0x0202);
5958
regs.set_sp(user_sp.value());
59+
6060
#if ARCH(X86_64)
61+
regs.set_flags(0x0202);
62+
regs.cr3 = address_space().with([](auto& space) { return space->page_directory().cr3(); });
63+
6164
regs.rdi = params.rdi;
6265
regs.rsi = params.rsi;
6366
regs.rdx = params.rdx;
6467
regs.rcx = params.rcx;
6568
#endif
66-
regs.cr3 = address_space().with([](auto& space) { return space->page_directory().cr3(); });
6769

6870
TRY(thread->make_thread_specific_region({}));
6971

Kernel/Thread.cpp

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -77,33 +77,12 @@ Thread::Thread(NonnullLockRefPtr<Process> process, NonnullOwnPtr<Memory::Region>
7777

7878
reset_fpu_state();
7979

80-
// Only IF is set when a process boots.
81-
m_regs.set_flags(0x0202);
82-
83-
#if ARCH(X86_64)
84-
if (m_process->is_kernel_process())
85-
m_regs.cs = GDT_SELECTOR_CODE0;
86-
else
87-
m_regs.cs = GDT_SELECTOR_CODE3 | 3;
88-
#elif ARCH(AARCH64)
89-
TODO_AARCH64();
90-
#else
91-
# error Unknown architecture
92-
#endif
93-
94-
m_regs.cr3 = m_process->address_space().with([](auto& space) { return space->page_directory().cr3(); });
95-
9680
m_kernel_stack_base = m_kernel_stack_region->vaddr().get();
9781
m_kernel_stack_top = m_kernel_stack_region->vaddr().offset(default_kernel_stack_size).get() & ~(FlatPtr)0x7u;
9882

99-
if (m_process->is_kernel_process()) {
100-
m_regs.set_sp(m_kernel_stack_top);
101-
m_regs.set_sp0(m_kernel_stack_top);
102-
} else {
103-
// Ring 3 processes get a separate stack for ring 0.
104-
// The ring 3 stack will be assigned by exec().
105-
m_regs.set_sp0(m_kernel_stack_top);
106-
}
83+
m_process->address_space().with([&](auto& space) {
84+
m_regs.set_initial_state(m_process->is_kernel_process(), *space, m_kernel_stack_top);
85+
});
10786

10887
// We need to add another reference if we could successfully create
10988
// all the resources needed for this thread. The reason for this is that

Kernel/Thread.h

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <AK/Vector.h>
1818
#include <Kernel/API/POSIX/sched.h>
1919
#include <Kernel/Arch/RegisterState.h>
20+
#include <Kernel/Arch/ThreadRegisters.h>
2021
#include <Kernel/Debug.h>
2122
#include <Kernel/Forward.h>
2223
#include <Kernel/KString.h>
@@ -49,55 +50,6 @@ struct ThreadSpecificData {
4950

5051
#define THREAD_AFFINITY_DEFAULT 0xffffffff
5152

52-
struct ThreadRegisters {
53-
#if ARCH(X86_64)
54-
FlatPtr rdi;
55-
FlatPtr rsi;
56-
FlatPtr rbp;
57-
FlatPtr rsp;
58-
FlatPtr rbx;
59-
FlatPtr rdx;
60-
FlatPtr rcx;
61-
FlatPtr rax;
62-
FlatPtr r8;
63-
FlatPtr r9;
64-
FlatPtr r10;
65-
FlatPtr r11;
66-
FlatPtr r12;
67-
FlatPtr r13;
68-
FlatPtr r14;
69-
FlatPtr r15;
70-
FlatPtr rip;
71-
FlatPtr rsp0;
72-
#endif
73-
FlatPtr cs;
74-
75-
#if ARCH(X86_64)
76-
FlatPtr rflags;
77-
FlatPtr flags() const { return rflags; }
78-
void set_flags(FlatPtr value) { rflags = value; }
79-
void set_sp(FlatPtr value) { rsp = value; }
80-
void set_sp0(FlatPtr value) { rsp0 = value; }
81-
void set_ip(FlatPtr value) { rip = value; }
82-
#endif
83-
84-
FlatPtr cr3;
85-
86-
FlatPtr ip() const
87-
{
88-
#if ARCH(X86_64)
89-
return rip;
90-
#endif
91-
}
92-
93-
FlatPtr sp() const
94-
{
95-
#if ARCH(X86_64)
96-
return rsp;
97-
#endif
98-
}
99-
};
100-
10153
class Thread
10254
: public ListedRefCounted<Thread, LockType::Spinlock>
10355
, public LockWeakable<Thread> {

0 commit comments

Comments
 (0)