add ringswitch stuff

This commit is contained in:
2025-11-26 02:48:46 +01:00
parent a7b488f270
commit 2b0257f849
3 changed files with 47 additions and 3 deletions

View File

@@ -11,6 +11,30 @@ void switchToUsermode(void *stackpointer, void *kickoff,
(void)stackpointer;
(void)kickoff;
(void)kickoff_parameter;
// Segment Selectors for Ring 3
constexpr uint16_t user_cs = 3 << 3 | 3;
constexpr uint16_t user_ds = 4 << 3 | 3;
asm volatile ( \
"pushq %[user_data] \n" \
"pushq %[user_stack] \n" \
"pushq %[user_eflags] \n" \
"pushq %[user_code] \n" \
"pushq %[user_function] \n" \
"mov %[user_parameter], %%rdi\n" \
"iretq \n" \
: \
: [user_data] "r"((uint64_t)user_ds),
[user_code] "r"((uint64_t)user_cs),
[user_stack] "r"((uint64_t)stackpointer),
[user_eflags] "r"((uint64_t)1<<9 | 2), // Interrupt Enable Flag
[user_function] "r"((uint64_t)kickoff),
[user_parameter] "r"((uint64_t)kickoff_parameter)
\
: "memory", "rdi"\
);
__builtin_unreachable();
}
} // namespace Ring