Save/restore GS segment on interrupt

This commit is contained in:
Jeremy Soller
2022-08-17 21:13:35 -06:00
parent bd9ee98ba9
commit 472081f8ba
2 changed files with 36 additions and 1 deletions

View File

@@ -70,6 +70,7 @@ impl IretRegisters {
#[derive(Default)]
#[repr(packed)]
pub struct InterruptStack {
pub gs: usize,
pub preserved: PreservedRegisters,
pub scratch: ScratchRegisters,
pub iret: IretRegisters,
@@ -204,6 +205,22 @@ macro_rules! pop_preserved {
" };
}
macro_rules! enter_gs {
() => { "
// Enter kernel GS segment
push gs
push 0x18
pop gs
" }
}
macro_rules! exit_gs {
() => { "
// Exit kernel GS segment
pop gs
" }
}
#[macro_export]
macro_rules! interrupt_stack {
// XXX: Apparently we cannot use $expr and check for bool exhaustiveness, so we will have to
@@ -234,6 +251,9 @@ macro_rules! interrupt_stack {
push_scratch!(),
push_preserved!(),
// Enter kernel TLS segment
enter_gs!(),
// TODO: Map PTI
// $crate::arch::x86::pti::map();
@@ -247,6 +267,9 @@ macro_rules! interrupt_stack {
// TODO: Unmap PTI
// $crate::arch::x86::pti::unmap();
// Exit kernel TLS segment
exit_gs!(),
// Restore all userspace registers
pop_preserved!(),
pop_scratch!(),
@@ -279,6 +302,9 @@ macro_rules! interrupt {
"push eax\n",
push_scratch!(),
// Enter kernel TLS segment
enter_gs!(),
// TODO: Map PTI
// $crate::arch::x86::pti::map();
@@ -288,6 +314,9 @@ macro_rules! interrupt {
// TODO: Unmap PTI
// $crate::arch::x86::pti::unmap();
// Exit kernel TLS segment
exit_gs!(),
// Restore all userspace registers
pop_scratch!(),
@@ -336,6 +365,9 @@ macro_rules! interrupt_error {
push_scratch!(),
push_preserved!(),
// Enter kernel TLS segment
enter_gs!(),
// Put code in, it's now in eax
"push eax\n",
@@ -355,6 +387,9 @@ macro_rules! interrupt_error {
// Pop code
"add esp, 8\n",
// Exit kernel TLS segment
exit_gs!(),
// Restore all userspace registers
pop_preserved!(),
pop_scratch!(),

View File

@@ -323,7 +323,7 @@ pub unsafe extern "C" fn usermode(_ip: usize, _sp: usize, _arg: usize, _is_singl
mov ds, eax
mov es, eax
mov fs, eax
// gs keeps kernel selector for simplicity
mov gs, eax
// Set up iret stack
push eax // stack selector