Skip to content

Commit c90ca90

Browse files
committed
feat: update kprobe impl
Signed-off-by: Godones <chenlinfeng25@outlook.com>
1 parent c0e28aa commit c90ca90

File tree

12 files changed

+253
-211
lines changed

12 files changed

+253
-211
lines changed

.vscode/setting.json

Lines changed: 0 additions & 14 deletions
This file was deleted.

.vscode/settings.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"rust-analyzer.cargo.target": "riscv64gc-unknown-none-elf",
3+
"rust-analyzer.check.allTargets": false,
4+
"rust-analyzer.checkOnSave": true,
5+
"rust-analyzer.check.command": "check",
6+
"rust-analyzer.check.extraArgs": [
7+
"--target",
8+
"riscv64gc-unknown-none-elf"
9+
],
10+
}

Cargo.lock

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

kernel/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ ksync = { path = "../subsystems/ksync" }
2424
knet = { path = "../subsystems/knet" }
2525
gmanager = { path = "../subsystems/gmanager" }
2626
shim = { path = "../subsystems/shim", features = ["kernel"] }
27-
kprobe = { git = "https://github.com/Godones/ext_ebpf" }
28-
bpf-basic = { git = "https://github.com/Godones/ext_ebpf" }
29-
ksym = { git = "https://github.com/Godones/ext_ebpf" }
27+
kprobe = { git = "https://github.com/Godones/ext_ebpf", rev = "9d09582" }
28+
bpf-basic = { git = "https://github.com/Godones/ext_ebpf", rev = "9d09582" }
29+
ksym = { git = "https://github.com/Godones/ext_ebpf", rev = "9d09582" }
3030
rbpf = { git = "https://github.com/qmonnet/rbpf.git", default-features = false }
3131

3232

kernel/src/ebpf/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub fn bpf(cmd: bpf_cmd, attr: &bpf_attr) -> AlienResult<isize> {
6161
.map_or_else(bpf_error_to_alien, |_| Ok(0))
6262
}
6363
bpf_cmd::BPF_MAP_FREEZE => {
64-
bpf_basic::map::bpf_map_freeze::<EbpfKernelAuxiliary>(update_arg)
64+
bpf_basic::map::bpf_map_freeze::<EbpfKernelAuxiliary>(update_arg.map_fd)
6565
.map_or_else(bpf_error_to_alien, |_| Ok(0))
6666
}
6767
// Program related commands

kernel/src/kprobe/kprobe_test.rs

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
use alloc::string::ToString;
22

3-
use kprobe::{KprobeBuilder, ProbeArgs};
3+
use kprobe::{KprobeBuilder, ProbeData, PtRegs};
44

5-
use crate::{
6-
kprobe::{register_kprobe, unregister_kprobe},
7-
trap::CommonTrapFrame,
8-
};
5+
use crate::kprobe::{register_kprobe, unregister_kprobe};
96

107
#[inline(never)]
118
#[no_mangle]
@@ -15,14 +12,12 @@ fn detect_func(x: usize, y: usize) -> usize {
1512
hart
1613
}
1714

18-
fn pre_handler(regs: &dyn ProbeArgs) {
19-
let pt_regs = regs.as_any().downcast_ref::<CommonTrapFrame>().unwrap();
20-
println_color!(34, "pre_handler: is kernel: {}", pt_regs.is_kernel());
15+
fn pre_handler(_data: &dyn ProbeData, pt_regs: &mut PtRegs) {
16+
println_color!(34, "pre_handler: ret_value: {}", pt_regs.ret_value());
2117
}
2218

23-
fn post_handler(regs: &dyn ProbeArgs) {
24-
let pt_regs = regs.as_any().downcast_ref::<CommonTrapFrame>().unwrap();
25-
println_color!(34, "post_handler: is kernel: {}", pt_regs.is_kernel());
19+
fn post_handler(_data: &dyn ProbeData, pt_regs: &mut PtRegs) {
20+
println_color!(34, "post_handler: ret_value: {}", pt_regs.ret_value());
2621
}
2722

2823
pub fn kprobe_test() {
@@ -31,29 +26,24 @@ pub fn kprobe_test() {
3126
"kprobe test for [detect_func]: {:#x}",
3227
detect_func as usize
3328
);
34-
let kprobe_builder = KprobeBuilder::new(
35-
None,
36-
detect_func as usize,
37-
0,
38-
pre_handler,
39-
post_handler,
40-
true,
41-
);
29+
let kprobe_builder = KprobeBuilder::new(None, detect_func as usize, 0, true)
30+
.with_pre_handler(pre_handler)
31+
.with_post_handler(post_handler);
4232

4333
let kprobe = register_kprobe(kprobe_builder);
44-
let new_pre_handler = |regs: &dyn ProbeArgs| {
45-
let pt_regs = regs.as_any().downcast_ref::<CommonTrapFrame>().unwrap();
46-
println_color!(34, "new_pre_handler: is kernel: {}", pt_regs.is_kernel());
34+
let new_pre_handler = |_data: &dyn ProbeData, pt_regs: &mut PtRegs| {
35+
println_color!(34, "new_pre_handler: ret_value: {}", pt_regs.ret_value());
4736
};
4837

4938
let builder2 = KprobeBuilder::new(
5039
Some("kprobe::detect_func".to_string()),
5140
detect_func as usize,
5241
0,
53-
new_pre_handler,
54-
post_handler,
5542
true,
56-
);
43+
)
44+
.with_pre_handler(new_pre_handler)
45+
.with_post_handler(post_handler);
46+
5747
let kprobe2 = register_kprobe(builder2);
5848
println_color!(
5949
34,

kernel/src/kprobe/mod.rs

Lines changed: 35 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,21 @@
11
#[cfg(feature = "kprobe_test")]
22
pub mod kprobe_test;
33

4-
use alloc::sync::Arc;
4+
use alloc::{sync::Arc, vec::Vec};
55
use core::alloc::Layout;
66

77
use config::FRAME_SIZE;
8-
use kprobe::{Kprobe, KprobeAuxiliaryOps, KprobeBuilder, KprobeManager, KprobePointList};
8+
use kprobe::{
9+
Kprobe, KprobeAuxiliaryOps, KprobeBuilder, KprobeManager, KprobePointList, KretprobeInstance,
10+
};
911
use ksync::Mutex;
1012
use mem::{alloc_kernel_free_region, kernel_space};
1113
use page_table::{addr::VirtAddr, pte::MappingFlags};
1214

13-
use crate::trap::CommonTrapFrame;
15+
use crate::{task::current_task, trap::CommonTrapFrame};
1416

1517
pub type KernelKprobe = Kprobe<Mutex<()>, KprobeAuxiliary>;
1618

17-
#[repr(C)]
18-
#[derive(Debug, Copy, Clone)]
19-
pub struct KProbeContext {
20-
pub pc: usize,
21-
pub ra: usize,
22-
pub sp: usize,
23-
pub gp: usize,
24-
pub tp: usize,
25-
pub t0: usize,
26-
pub t1: usize,
27-
pub t2: usize,
28-
pub s0: usize,
29-
pub s1: usize,
30-
pub a0: usize,
31-
pub a1: usize,
32-
pub a2: usize,
33-
pub a3: usize,
34-
pub a4: usize,
35-
pub a5: usize,
36-
pub a6: usize,
37-
pub a7: usize,
38-
pub s2: usize,
39-
pub s3: usize,
40-
pub s4: usize,
41-
pub s5: usize,
42-
pub s6: usize,
43-
pub s7: usize,
44-
pub s8: usize,
45-
pub s9: usize,
46-
pub s10: usize,
47-
pub s11: usize,
48-
pub t3: usize,
49-
pub t4: usize,
50-
pub t5: usize,
51-
pub t6: usize,
52-
}
53-
54-
impl From<&CommonTrapFrame> for KProbeContext {
55-
fn from(value: &CommonTrapFrame) -> Self {
56-
KProbeContext {
57-
pc: value.pc(),
58-
ra: value.regs()[1], // x1
59-
sp: value.regs()[2], // x2
60-
gp: value.regs()[3], // x3
61-
tp: value.regs()[4], // x4
62-
t0: value.regs()[5], // x5
63-
t1: value.regs()[6], // x6
64-
t2: value.regs()[7], // x7
65-
s0: value.regs()[8], // x8
66-
s1: value.regs()[9], // x9
67-
a0: value.regs()[10], // x10
68-
a1: value.regs()[11], // x11
69-
a2: value.regs()[12], // x12
70-
a3: value.regs()[13], // x13
71-
a4: value.regs()[14], // x14
72-
a5: value.regs()[15], // x15
73-
a6: value.regs()[16], // x16
74-
a7: value.regs()[17], // x17
75-
s2: value.regs()[18], // x18
76-
s3: value.regs()[19], // x19
77-
s4: value.regs()[20], // x20
78-
s5: value.regs()[21], // x21
79-
s6: value.regs()[22], // x22
80-
s7: value.regs()[23], // x23
81-
s8: value.regs()[24], // x24
82-
s9: value.regs()[25], // x25
83-
s10: value.regs()[26], // x26
84-
s11: value.regs()[27], // x27
85-
t3: value.regs()[28], // x28
86-
t4: value.regs()[29], // x29
87-
t5: value.regs()[30], // x30
88-
t6: value.regs()[31], // x31
89-
}
90-
}
91-
}
92-
9319
#[derive(Debug)]
9420
pub struct KprobeAuxiliary;
9521

@@ -135,6 +61,32 @@ impl KprobeAuxiliaryOps for KprobeAuxiliary {
13561
.unmap_region(VirtAddr::from(region_start), FRAME_SIZE)
13662
.unwrap();
13763
}
64+
65+
fn insert_kretprobe_instance_to_task(instance: kprobe::KretprobeInstance) {
66+
static INSTANCE: Mutex<Vec<KretprobeInstance>> = Mutex::new(Vec::new());
67+
let task = current_task();
68+
if let Some(task) = task {
69+
let mut inner = task.access_inner();
70+
inner.kretprobe_instances.push(instance);
71+
} else {
72+
// If the current task is None, we can store it in a static variable
73+
let mut instances = INSTANCE.lock();
74+
instances.push(instance);
75+
}
76+
}
77+
78+
fn pop_kretprobe_instance_from_task() -> kprobe::KretprobeInstance {
79+
static INSTANCE: Mutex<Vec<KretprobeInstance>> = Mutex::new(Vec::new());
80+
let task = current_task();
81+
if let Some(task) = task {
82+
let mut inner = task.access_inner();
83+
inner.kretprobe_instances.pop().unwrap()
84+
} else {
85+
// If the current task is None, we can pop it from the static variable
86+
let mut instances = INSTANCE.lock();
87+
instances.pop().unwrap()
88+
}
89+
}
13890
}
13991

14092
pub static KPROBE_MANAGER: Mutex<KprobeManager<Mutex<()>, KprobeAuxiliary>> =
@@ -159,5 +111,8 @@ pub fn register_kprobe(kprobe_builder: KprobeBuilder<KprobeAuxiliary>) -> Arc<Ke
159111

160112
pub fn run_all_kprobe(frame: &mut CommonTrapFrame) -> Option<()> {
161113
let mut manager = KPROBE_MANAGER.lock();
162-
kprobe::kprobe_handler_from_break(&mut manager, frame)
114+
let mut pt_regs = frame.to_pt_regs();
115+
let res = kprobe::kprobe_handler_from_break(&mut manager, &mut pt_regs);
116+
frame.update_from_pt_regs(&pt_regs);
117+
res
163118
}

0 commit comments

Comments
 (0)