#interrupt #bare-metal #userspace #x86-64 #risc-v #no-std

nightly no-std trapframe

Handle Trap Frame across kernel and user space on multiple ISAs

20 releases

0.9.0 Feb 27, 2022
0.8.0 Jul 26, 2021
0.7.0 Feb 13, 2021
0.6.0 Oct 1, 2020
0.1.4 Mar 24, 2020

#337 in Embedded development

Download history 407/week @ 2023-12-05 414/week @ 2023-12-12 363/week @ 2023-12-19 77/week @ 2023-12-26 224/week @ 2024-01-02 280/week @ 2024-01-09 349/week @ 2024-01-16 403/week @ 2024-01-23 429/week @ 2024-01-30 495/week @ 2024-02-06 612/week @ 2024-02-13 480/week @ 2024-02-20 512/week @ 2024-02-27 468/week @ 2024-03-05 500/week @ 2024-03-12 479/week @ 2024-03-19

2,035 downloads per month

MIT license

66KB
2K SLoC

Rust 1K SLoC // 0.1% comments GNU Style Assembly 782 SLoC // 0.0% comments

TrapFrame-rs

Crate Docs Actions Status

Handle Trap Frame across kernel and user space on multiple ISAs.

Supported ISA: x86_64, aarch64, riscv32, riscv64, mipsel

Example

Go to user space

use trapframe::{UserContext, GeneralRegs};

fn kernel_thread() {
    // initialize trap handling
    unsafe {
        trapframe::init();
    }
    // construct a user space context, set registers
    let mut context = UserContext {
        general: GeneralRegs {
            rip: 0x1000,
            rsp: 0x10000,
            ..Default::default()
        },
        ..Default::default()
    };
    // go to user space with the context
    context.run();
    // come back from user space, maybe syscall or trap
    println!("back from user: {:#x?}", context);
    // check the context and handle the trap
    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]	// export a function 'trap_handler'
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:

x86_64

Dependencies

~1MB
~20K SLoC