TrapFrame-rs

Handle Trap Frame across kernel and user space on multiple ISAs.
Supported ISA: x86_64, aarch64, riscv32, riscv64, mipsel
info
- Ver 0.8.0 was tested for x86_64 ISA by rustc 1.55+ nightly
Example
Go to user space
use trapframe::{UserContext, GeneralRegs};
fn kernel_thread() {
unsafe {
trapframe::init();
}
let mut context = UserContext {
general: GeneralRegs {
rip: 0x1000,
rsp: 0x10000,
..Default::default()
},
..Default::default()
};
context.run();
println!("back from user: {:#x?}", context);
match context.trap_num {
0x3 => println!("breakpoint"),
0xd => println!("general protection fault"),
0x100 => println!("syscall: id={}", context.general.rax),
...
}
}
Handle kernel trap
use trapframe::TrapFrame;
#[no_mangle] extern "sysv64" fn trap_handler(tf: &mut TrapFrame) {
match tf.trap_num {
0x3 => {
println!("TRAP: Breakpoint");
tf.rip += 1;
}
_ => panic!("TRAP: {:#x?}", tf),
}
}
More examples
Internal
Control flow on x86_64:
