linfeng 3d663af8a2
fix: remove useless c code (#1116)
* fix: remove useless c code

remove printk.c file
remove old test_ebpf file
implement `lookup_kallsyms` and `addr_from_symbol` using rust

* fix the weak linkage

* feat(kernel): 添加cfg-if依赖并优化panic模块的条件编译

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
Co-authored-by: longjin <longjin@DragonOS.org>
2025-03-27 14:16:10 +08:00

63 lines
2.0 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use core::ffi::CStr;
#[linkage = "weak"]
#[no_mangle]
fn kallsyms_address() {}
#[linkage = "weak"]
#[no_mangle]
fn kallsyms_num() {}
#[linkage = "weak"]
#[no_mangle]
fn kallsyms_names_index() {}
#[linkage = "weak"]
#[no_mangle]
fn kallsyms_names() {}
pub unsafe fn lookup_kallsyms(addr: u64, level: i32) -> Option<()> {
let sym_names = kallsyms_names as *const u8;
// 由于符号表使用nm -n生成因此是按照地址升序排列的因此可以二分
let sym_num = kallsyms_num as usize;
let kallsyms_address_list =
core::slice::from_raw_parts(kallsyms_address as *const u64, sym_num);
let sym_names_index = kallsyms_names_index as *const u64;
let sym_names_index = core::slice::from_raw_parts(sym_names_index, sym_num);
let mut index = usize::MAX;
for i in 0..sym_num - 1 {
if addr > kallsyms_address_list[i] && addr <= kallsyms_address_list[i + 1] {
index = i;
break;
}
}
return if index < sym_num {
let sym_name = CStr::from_ptr(sym_names.add(sym_names_index[index] as usize) as _)
.to_str()
.unwrap();
println!(
"[{}] function:{}() \t(+) {:04} address:{:#018x}",
level,
sym_name,
addr - kallsyms_address_list[index],
addr
);
Some(())
} else {
None
};
}
pub unsafe fn addr_from_symbol(symbol: &str) -> Option<u64> {
let sym_num = kallsyms_num as usize;
let sym_names = kallsyms_names as *const u8;
let kallsyms_address_list =
core::slice::from_raw_parts(kallsyms_address as *const u64, sym_num);
let sym_names_index = kallsyms_names_index as *const u64;
let sym_names_index_list = core::slice::from_raw_parts(sym_names_index, sym_num);
for i in 0..sym_num {
let sym_name_cstr = CStr::from_ptr(sym_names.add(sym_names_index_list[i] as usize) as _);
let sym_name = sym_name_cstr.to_str().unwrap();
if sym_name == symbol {
return Some(kallsyms_address_list[i]);
}
}
None
}