1 use crate::arch::interrupt::TrapFrame;
2
setup_single_step(frame: &mut TrapFrame, step_addr: usize)3 pub fn setup_single_step(frame: &mut TrapFrame, step_addr: usize) {
4 frame.rflags |= 0x100;
5 frame.set_pc(step_addr);
6 }
7
clear_single_step(frame: &mut TrapFrame, return_addr: usize)8 pub fn clear_single_step(frame: &mut TrapFrame, return_addr: usize) {
9 frame.rflags &= !0x100;
10 frame.set_pc(return_addr);
11 }
12
13 #[repr(C)]
14 #[derive(Debug, Copy, Clone)]
15 pub struct KProbeContext {
16 pub r15: ::core::ffi::c_ulong,
17 pub r14: ::core::ffi::c_ulong,
18 pub r13: ::core::ffi::c_ulong,
19 pub r12: ::core::ffi::c_ulong,
20 pub rbp: ::core::ffi::c_ulong,
21 pub rbx: ::core::ffi::c_ulong,
22 pub r11: ::core::ffi::c_ulong,
23 pub r10: ::core::ffi::c_ulong,
24 pub r9: ::core::ffi::c_ulong,
25 pub r8: ::core::ffi::c_ulong,
26 pub rax: ::core::ffi::c_ulong,
27 pub rcx: ::core::ffi::c_ulong,
28 pub rdx: ::core::ffi::c_ulong,
29 pub rsi: ::core::ffi::c_ulong,
30 pub rdi: ::core::ffi::c_ulong,
31 pub orig_rax: ::core::ffi::c_ulong,
32 pub rip: ::core::ffi::c_ulong,
33 pub cs: ::core::ffi::c_ulong,
34 pub eflags: ::core::ffi::c_ulong,
35 pub rsp: ::core::ffi::c_ulong,
36 pub ss: ::core::ffi::c_ulong,
37 }
38
39 impl From<&TrapFrame> for KProbeContext {
from(trap_frame: &TrapFrame) -> Self40 fn from(trap_frame: &TrapFrame) -> Self {
41 Self {
42 r15: trap_frame.r15,
43 r14: trap_frame.r14,
44 r13: trap_frame.r13,
45 r12: trap_frame.r12,
46 rbp: trap_frame.rbp,
47 rbx: trap_frame.rbx,
48 r11: trap_frame.r11,
49 r10: trap_frame.r10,
50 r9: trap_frame.r9,
51 r8: trap_frame.r8,
52 rax: trap_frame.rax,
53 rcx: trap_frame.rcx,
54 rdx: trap_frame.rdx,
55 rsi: trap_frame.rsi,
56 rdi: trap_frame.rdi,
57 orig_rax: 0,
58 rip: trap_frame.rip,
59 cs: trap_frame.cs,
60 eflags: trap_frame.rflags,
61 rsp: trap_frame.rsp,
62 ss: trap_frame.ss,
63 }
64 }
65 }
66