Skip to content

Commit 439b180

Browse files
committed
feat: Add a feature for kprobe
Refactor the conversion implementation of TrapFrame and PtRegs. Signed-off-by: Godones <chenlinfeng25@outlook.com>
1 parent 1ba7ad9 commit 439b180

File tree

8 files changed

+174
-101
lines changed

8 files changed

+174
-101
lines changed

Cargo.lock

Lines changed: 13 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ fp-simd = []
2727
tls = []
2828
uspace = []
2929
arm-el2 = []
30+
kprobe = ["dep:kprobe"]
3031

3132
[dependencies]
3233
axbacktrace = "0.1"
@@ -36,7 +37,9 @@ cfg-if = "1.0"
3637
memory_addr = "0.4"
3738
page_table_entry = "0.5"
3839
static_assertions = "1.1.0"
39-
axprobe = { git = "https://github.com/Starry-OS/axprobe" }
40+
41+
[target.'cfg(not(target_arch = "aarch64"))'.dependencies]
42+
kprobe = { git = "https://github.com/Starry-OS/kprobe", rev = "318cbb2", optional = true }
4043

4144
[target.'cfg(target_arch = "x86_64")'.dependencies]
4245
x86 = "0.52"

src/loongarch64/context.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
use core::arch::naked_asm;
22
#[cfg(feature = "fp-simd")]
33
use core::mem::offset_of;
4-
5-
use axprobe::PtRegs;
64
use memory_addr::VirtAddr;
75

86
/// General registers of Loongarch64.
@@ -356,39 +354,43 @@ unsafe extern "C" fn context_switch(_current_task: &mut TaskContext, _next_task:
356354
)
357355
}
358356

359-
impl TrapFrame {
360-
pub fn to_pt_regs(&mut self) -> axprobe::PtRegs {
357+
#[cfg(feature = "kprobe")]
358+
impl From<&TrapFrame> for kprobe::PtRegs {
359+
fn from(tf: &TrapFrame) -> Self {
361360
let regs = [0; 32];
362361
unsafe {
363362
core::ptr::copy_nonoverlapping(
364-
&self.regs.zero as *const usize,
363+
&tf.regs as *const GeneralRegisters as *const usize,
365364
regs.as_ptr() as *mut usize,
366365
32,
367366
);
368367
}
369-
PtRegs {
368+
kprobe::PtRegs {
370369
regs,
371370
orig_a0: 0,
372-
csr_era: self.era,
371+
csr_era: tf.era,
373372
csr_badvaddr: 0,
374373
csr_crmd: 0,
375-
csr_prmd: self.prmd,
374+
csr_prmd: tf.prmd,
376375
csr_euen: 0,
377376
csr_ecfg: 0,
378377
csr_estat: 0,
379378
}
380379
}
380+
}
381381

382-
pub fn update_from_pt_regs(&mut self, pt_regs: axprobe::PtRegs) {
382+
#[cfg(feature = "kprobe")]
383+
impl TrapFrame {
384+
/// Update the TrapFrame from kprobe::PtRegs
385+
pub fn update_from_ptregs(&mut self, ptregs: kprobe::PtRegs) {
383386
unsafe {
384387
core::ptr::copy_nonoverlapping(
385-
pt_regs.regs.as_ptr() as *const usize,
386-
&mut self.regs.zero as *mut usize,
388+
ptregs.regs.as_ptr() as *const usize,
389+
&mut self.regs as *mut GeneralRegisters as *mut usize,
387390
32,
388391
);
389392
}
390-
self.era = pt_regs.csr_era;
391-
self.prmd = pt_regs.csr_prmd;
392-
// other csr fields are ignored
393+
self.era = ptregs.csr_era;
394+
self.prmd = ptregs.csr_prmd;
393395
}
394396
}

src/loongarch64/trap.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ core::arch::global_asm!(
1313
);
1414

1515
fn handle_breakpoint(tf: &mut TrapFrame) {
16+
debug!("Exception(Breakpoint) @ {:#x} ", tf.era);
1617
if core::hint::likely(handle_trap!(BREAK_HANDLER, tf)) {
1718
return;
1819
}
19-
debug!("Exception(Breakpoint) @ {:#x} ", tf.era);
20-
tf.era += 2; // skip ebreak instruction
20+
tf.era += 4;
2121
}
2222

2323
fn handle_page_fault(tf: &mut TrapFrame, access_flags: PageFaultFlags) {

src/riscv/context.rs

Lines changed: 74 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -429,82 +429,86 @@ unsafe extern "C" fn context_switch(_current_task: &mut TaskContext, _next_task:
429429
)
430430
}
431431

432-
impl TrapFrame {
433-
pub fn to_pt_regs(&mut self) -> axprobe::PtRegs {
434-
axprobe::PtRegs {
435-
epc: self.sepc,
436-
ra: self.regs.ra,
437-
sp: self.regs.sp,
438-
gp: self.regs.gp,
439-
tp: self.regs.tp,
440-
t0: self.regs.t0,
441-
t1: self.regs.t1,
442-
t2: self.regs.t2,
443-
s0: self.regs.s0,
444-
s1: self.regs.s1,
445-
a0: self.regs.a0,
446-
a1: self.regs.a1,
447-
a2: self.regs.a2,
448-
a3: self.regs.a3,
449-
a4: self.regs.a4,
450-
a5: self.regs.a5,
451-
a6: self.regs.a6,
452-
a7: self.regs.a7,
453-
s2: self.regs.s2,
454-
s3: self.regs.s3,
455-
s4: self.regs.s4,
456-
s5: self.regs.s5,
457-
s6: self.regs.s6,
458-
s7: self.regs.s7,
459-
s8: self.regs.s8,
460-
s9: self.regs.s9,
461-
s10: self.regs.s10,
462-
s11: self.regs.s11,
463-
t3: self.regs.t3,
464-
t4: self.regs.t4,
465-
t5: self.regs.t5,
466-
t6: self.regs.t6,
467-
status: self.sstatus.bits(),
432+
#[cfg(feature = "kprobe")]
433+
impl From<&TrapFrame> for kprobe::PtRegs {
434+
fn from(tf: &TrapFrame) -> Self {
435+
kprobe::PtRegs {
436+
epc: tf.sepc,
437+
ra: tf.regs.ra,
438+
sp: tf.regs.sp,
439+
gp: tf.regs.gp,
440+
tp: tf.regs.tp,
441+
t0: tf.regs.t0,
442+
t1: tf.regs.t1,
443+
t2: tf.regs.t2,
444+
s0: tf.regs.s0,
445+
s1: tf.regs.s1,
446+
a0: tf.regs.a0,
447+
a1: tf.regs.a1,
448+
a2: tf.regs.a2,
449+
a3: tf.regs.a3,
450+
a4: tf.regs.a4,
451+
a5: tf.regs.a5,
452+
a6: tf.regs.a6,
453+
a7: tf.regs.a7,
454+
s2: tf.regs.s2,
455+
s3: tf.regs.s3,
456+
s4: tf.regs.s4,
457+
s5: tf.regs.s5,
458+
s6: tf.regs.s6,
459+
s7: tf.regs.s7,
460+
s8: tf.regs.s8,
461+
s9: tf.regs.s9,
462+
s10: tf.regs.s10,
463+
s11: tf.regs.s11,
464+
t3: tf.regs.t3,
465+
t4: tf.regs.t4,
466+
t5: tf.regs.t5,
467+
t6: tf.regs.t6,
468+
status: tf.sstatus.bits(),
468469
// todo : other fields
469470
badaddr: 0,
470471
cause: 0,
471472
orig_a0: 0,
472473
}
473474
}
475+
}
474476

475-
pub fn update_from_pt_regs(&mut self, pt_regs: axprobe::PtRegs) {
476-
self.sepc = pt_regs.epc;
477-
self.regs.ra = pt_regs.ra;
478-
self.regs.sp = pt_regs.sp;
479-
self.regs.gp = pt_regs.gp;
480-
self.regs.tp = pt_regs.tp;
481-
self.regs.t0 = pt_regs.t0;
482-
self.regs.t1 = pt_regs.t1;
483-
self.regs.t2 = pt_regs.t2;
484-
self.regs.s0 = pt_regs.s0;
485-
self.regs.s1 = pt_regs.s1;
486-
self.regs.a0 = pt_regs.a0;
487-
self.regs.a1 = pt_regs.a1;
488-
self.regs.a2 = pt_regs.a2;
489-
self.regs.a3 = pt_regs.a3;
490-
self.regs.a4 = pt_regs.a4;
491-
self.regs.a5 = pt_regs.a5;
492-
self.regs.a6 = pt_regs.a6;
493-
self.regs.a7 = pt_regs.a7;
494-
self.regs.s2 = pt_regs.s2;
495-
self.regs.s3 = pt_regs.s3;
496-
self.regs.s4 = pt_regs.s4;
497-
self.regs.s5 = pt_regs.s5;
498-
self.regs.s6 = pt_regs.s6;
499-
self.regs.s7 = pt_regs.s7;
500-
self.regs.s8 = pt_regs.s8;
501-
self.regs.s9 = pt_regs.s9;
502-
self.regs.s10 = pt_regs.s10;
503-
self.regs.s11 = pt_regs.s11;
504-
self.regs.t3 = pt_regs.t3;
505-
self.regs.t4 = pt_regs.t4;
506-
self.regs.t5 = pt_regs.t5;
507-
self.regs.t6 = pt_regs.t6;
508-
// todo : other fields
477+
impl TrapFrame {
478+
/// Update the TrapFrame from kprobe::PtRegs
479+
pub fn update_from_ptregs(&mut self, ptregs: kprobe::PtRegs) {
480+
self.sepc = ptregs.epc;
481+
self.regs.ra = ptregs.ra;
482+
self.regs.sp = ptregs.sp;
483+
self.regs.gp = ptregs.gp;
484+
self.regs.tp = ptregs.tp;
485+
self.regs.t0 = ptregs.t0;
486+
self.regs.t1 = ptregs.t1;
487+
self.regs.t2 = ptregs.t2;
488+
self.regs.s0 = ptregs.s0;
489+
self.regs.s1 = ptregs.s1;
490+
self.regs.a0 = ptregs.a0;
491+
self.regs.a1 = ptregs.a1;
492+
self.regs.a2 = ptregs.a2;
493+
self.regs.a3 = ptregs.a3;
494+
self.regs.a4 = ptregs.a4;
495+
self.regs.a5 = ptregs.a5;
496+
self.regs.a6 = ptregs.a6;
497+
self.regs.a7 = ptregs.a7;
498+
self.regs.s2 = ptregs.s2;
499+
self.regs.s3 = ptregs.s3;
500+
self.regs.s4 = ptregs.s4;
501+
self.regs.s5 = ptregs.s5;
502+
self.regs.s6 = ptregs.s6;
503+
self.regs.s7 = ptregs.s7;
504+
self.regs.s8 = ptregs.s8;
505+
self.regs.s9 = ptregs.s9;
506+
self.regs.s10 = ptregs.s10;
507+
self.regs.s11 = ptregs.s11;
508+
self.regs.t3 = ptregs.t3;
509+
self.regs.t4 = ptregs.t4;
510+
self.regs.t5 = ptregs.t5;
511+
self.regs.t6 = ptregs.t6;
512+
self.sstatus = sstatus::Sstatus::from_bits(ptregs.status);
509513
}
510514
}

src/riscv/trap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ core::arch::global_asm!(
1818
);
1919

2020
fn handle_breakpoint(tf: &mut TrapFrame) {
21+
debug!("Exception(Breakpoint) @ {:#x} ", tf.sepc);
2122
if core::hint::likely(handle_trap!(BREAK_HANDLER, tf)) {
2223
return;
2324
}
24-
debug!("Exception(Breakpoint) @ {:#x} ", tf.sepc);
2525
tf.sepc += 2; // skip ebreak instruction
2626
}
2727

src/x86_64/context.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,3 +369,59 @@ unsafe extern "C" fn context_switch(_current_stack: &mut u64, _next_stack: &u64)
369369
ret",
370370
)
371371
}
372+
#[cfg(feature = "kprobe")]
373+
impl From<&TrapFrame> for kprobe::PtRegs {
374+
fn from(value: &TrapFrame) -> Self {
375+
kprobe::PtRegs {
376+
r15: value.r15 as _,
377+
r14: value.r14 as _,
378+
r13: value.r13 as _,
379+
r12: value.r12 as _,
380+
rbp: value.rbp as _,
381+
rbx: value.rbx as _,
382+
r11: value.r11 as _,
383+
r10: value.r10 as _,
384+
r9: value.r9 as _,
385+
r8: value.r8 as _,
386+
rax: value.rax as _,
387+
rcx: value.rcx as _,
388+
rdx: value.rdx as _,
389+
rsi: value.rsi as _,
390+
rdi: value.rdi as _,
391+
orig_rax: value.vector as _,
392+
rip: value.rip as _,
393+
cs: value.cs as _,
394+
rsp: value.rsp as _,
395+
ss: value.ss as _,
396+
rflags: value.rflags as _,
397+
}
398+
}
399+
}
400+
401+
#[cfg(feature = "kprobe")]
402+
impl TrapFrame {
403+
/// Update the TrapFrame from kprobe::PtRegs
404+
pub fn update_from_ptregs(&mut self, ptregs: kprobe::PtRegs) {
405+
self.r15 = ptregs.r15 as _;
406+
self.r14 = ptregs.r14 as _;
407+
self.r13 = ptregs.r13 as _;
408+
self.r12 = ptregs.r12 as _;
409+
self.rbp = ptregs.rbp as _;
410+
self.rbx = ptregs.rbx as _;
411+
self.r11 = ptregs.r11 as _;
412+
self.r10 = ptregs.r10 as _;
413+
self.r9 = ptregs.r9 as _;
414+
self.r8 = ptregs.r8 as _;
415+
self.rax = ptregs.rax as _;
416+
self.rcx = ptregs.rcx as _;
417+
self.rdx = ptregs.rdx as _;
418+
self.rsi = ptregs.rsi as _;
419+
self.rdi = ptregs.rdi as _;
420+
self.vector = ptregs.orig_rax as _;
421+
self.rip = ptregs.rip as _;
422+
self.cs = ptregs.cs as _;
423+
self.rflags = ptregs.rflags as _;
424+
self.rsp = ptregs.rsp as _;
425+
self.ss = ptregs.ss as _;
426+
}
427+
}

src/x86_64/trap.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,20 @@ fn handle_page_fault(tf: &TrapFrame) {
3030
}
3131
}
3232

33+
fn handle_breakpoint(tf: &mut TrapFrame) {
34+
debug!("#BP @ {:#x} ", tf.rip);
35+
if core::hint::likely(handle_trap!(BREAK_HANDLER, tf)) {
36+
return;
37+
}
38+
}
39+
3340
#[unsafe(no_mangle)]
3441
fn x86_trap_handler(tf: &mut TrapFrame) {
3542
#[cfg(feature = "uspace")]
3643
super::uspace::switch_to_kernel_fs_base(tf);
3744
match tf.vector as u8 {
3845
PAGE_FAULT_VECTOR => handle_page_fault(tf),
39-
BREAKPOINT_VECTOR => debug!("#BP @ {:#x} ", tf.rip),
46+
BREAKPOINT_VECTOR => handle_breakpoint(tf),
4047
GENERAL_PROTECTION_FAULT_VECTOR => {
4148
panic!(
4249
"#GP @ {:#x}, error_code={:#x}:\n{:#x?}\n{}",

0 commit comments

Comments
 (0)