pub struct InterruptStackFrame(/* private fields */);
Expand description
Wrapper type for the interrupt stack frame pushed by the CPU.
This type derefs to an InterruptStackFrameValue
, which allows reading the actual values.
This wrapper type ensures that no accidental modification of the interrupt stack frame
occurs, which can cause undefined behavior (see the as_mut
method for more information).
Implementations§
Source§impl InterruptStackFrame
impl InterruptStackFrame
Sourcepub fn new(
instruction_pointer: VirtAddr,
code_segment: SegmentSelector,
cpu_flags: RFlags,
stack_pointer: VirtAddr,
stack_segment: SegmentSelector,
) -> Self
pub fn new( instruction_pointer: VirtAddr, code_segment: SegmentSelector, cpu_flags: RFlags, stack_pointer: VirtAddr, stack_segment: SegmentSelector, ) -> Self
Creates a new interrupt stack frame with the given values.
Sourcepub unsafe fn as_mut(&mut self) -> Volatile<&mut InterruptStackFrameValue>
pub unsafe fn as_mut(&mut self) -> Volatile<&mut InterruptStackFrameValue>
Gives mutable access to the contents of the interrupt stack frame.
The Volatile
wrapper is used because LLVM optimizations remove non-volatile
modifications of the interrupt stack frame.
§Safety
This function is unsafe since modifying the content of the interrupt stack frame can easily lead to undefined behavior. For example, by writing an invalid value to the instruction pointer field, the CPU can jump to arbitrary code at the end of the interrupt.
Also, it is not fully clear yet whether modifications of the interrupt stack frame are officially supported by LLVM’s x86 interrupt calling convention.
Methods from Deref<Target = InterruptStackFrameValue>§
Sourcepub unsafe fn iretq(&self) -> !
pub unsafe fn iretq(&self) -> !
Call the iretq
(interrupt return) instruction.
This function doesn’t have to be called in an interrupt handler.
By manually construction a new InterruptStackFrameValue
it’s possible to transition
from a higher privilege level to a lower one.
§Safety
Calling iretq
is unsafe because setting the instruction pointer, stack pointer, RFlags,
CS and SS register can all cause undefined behaviour when done incorrectly.