Skip to content

Commit 1b6211e

Browse files
committed
fix: remove extern "C" rs_* functions
move gen_kallsyms.rs to build-scripts Signed-off-by: Godones <[email protected]>
1 parent 91a07ed commit 1b6211e

File tree

22 files changed

+147
-336
lines changed

22 files changed

+147
-336
lines changed

Diff for: .vscode/settings.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@
145145
"rust-analyzer.linkedProjects": [
146146
"./kernel/Cargo.toml",
147147
//"./tools/Cargo.toml",
148-
// "./kernel/src/debug/gen_kallsyms.rs",
148+
"./kernel/src/debug/gen_kallsyms.rs",
149149
],
150150
// "rust-analyzer.cargo.target": "riscv64gc-unknown-none-elf",
151151
"rust-analyzer.cargo.target": "x86_64-unknown-none",

Diff for: build-scripts/Cargo.lock

+5-14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: build-scripts/Cargo.toml

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
11
[workspace]
2-
members = [
3-
"kernel_build",
4-
]
2+
members = ["gen_kallsyms", "kernel_build"]
53
resolver = "2"

Diff for: build-scripts/Makefile

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
.PHONY: fmt
1+
all:
2+
@cargo +nightly-2024-11-05 build --release -p gen_kallsyms
23
fmt:
34
cargo fmt --all $(FMT_CHECK)
4-
55
clean:
66
@cargo clean
77
check:
88
@cargo +nightly-2024-11-05 check --workspace $(CARGO_ZBUILD) --message-format=json
9+
.PHONY: fmt

Diff for: build-scripts/gen_kallsyms/Cargo.toml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "gen_kallsyms"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]

Diff for: build-scripts/gen_kallsyms/src/main.rs

+122
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
use std::str;
2+
3+
#[derive(Debug, Clone)]
4+
struct KernelSymbolEntry {
5+
vaddr: u64,
6+
#[allow(dead_code)]
7+
symbol_type: char,
8+
symbol: String,
9+
symbol_length: usize,
10+
}
11+
12+
fn symbol_to_write(vaddr: u64, text_vaddr: u64, etext_vaddr: u64) -> bool {
13+
vaddr >= text_vaddr && vaddr <= etext_vaddr
14+
}
15+
fn read_symbol(line: &str) -> Option<KernelSymbolEntry> {
16+
if line.len() > 512 {
17+
return None;
18+
} // skip line with length >= 512
19+
let mut parts = line.split_whitespace();
20+
let vaddr = u64::from_str_radix(parts.next()?, 16).ok()?;
21+
let symbol_type = parts.next()?.chars().next()?;
22+
let symbol = parts.collect::<Vec<_>>().join(" ");
23+
if symbol_type != 'T' && symbol_type != 't' {
24+
return None;
25+
} // local symbol or global symbol in text section
26+
if symbol == "$x" {
27+
return None;
28+
} // skip $x symbol
29+
let symbol_length = symbol.len() + 1; // +1 for null terminator
30+
Some(KernelSymbolEntry {
31+
vaddr,
32+
symbol_type,
33+
symbol,
34+
symbol_length,
35+
})
36+
}
37+
38+
fn read_map() -> (Vec<KernelSymbolEntry>, u64, u64) {
39+
let mut symbol_table = Vec::new();
40+
let mut text_vaddr = 0;
41+
let mut etext_vaddr = 0;
42+
let mut line = String::new();
43+
loop {
44+
let size = std::io::stdin().read_line(&mut line).unwrap();
45+
if size == 0 {
46+
break;
47+
}
48+
line = line.trim().to_string();
49+
if let Some(entry) = read_symbol(&line) {
50+
if entry.symbol.starts_with("_text") {
51+
text_vaddr = entry.vaddr;
52+
} else if entry.symbol.starts_with("_etext") {
53+
etext_vaddr = entry.vaddr;
54+
}
55+
symbol_table.push(entry);
56+
}
57+
line.clear();
58+
}
59+
(symbol_table, text_vaddr, etext_vaddr)
60+
}
61+
62+
fn generate_result(symbol_table: &[KernelSymbolEntry], text_vaddr: u64, etext_vaddr: u64) {
63+
println!(".section .rodata\n");
64+
println!(".global kallsyms_address");
65+
println!(".align 8\n");
66+
println!("kallsyms_address:");
67+
68+
let mut last_vaddr = 0;
69+
let mut total_syms_to_write = 0;
70+
71+
for entry in symbol_table {
72+
if !symbol_to_write(entry.vaddr, text_vaddr, etext_vaddr) || entry.vaddr == last_vaddr {
73+
continue;
74+
}
75+
76+
println!("\t.quad\t{:#x}", entry.vaddr);
77+
total_syms_to_write += 1;
78+
last_vaddr = entry.vaddr;
79+
}
80+
81+
println!("\n.global kallsyms_num");
82+
println!(".align 8");
83+
println!("kallsyms_num:");
84+
println!("\t.quad\t{}", total_syms_to_write);
85+
86+
println!("\n.global kallsyms_names_index");
87+
println!(".align 8");
88+
println!("kallsyms_names_index:");
89+
90+
let mut position = 0;
91+
last_vaddr = 0;
92+
93+
for entry in symbol_table {
94+
if !symbol_to_write(entry.vaddr, text_vaddr, etext_vaddr) || entry.vaddr == last_vaddr {
95+
continue;
96+
}
97+
98+
println!("\t.quad\t{}", position);
99+
position += entry.symbol_length;
100+
last_vaddr = entry.vaddr;
101+
}
102+
103+
println!("\n.global kallsyms_names");
104+
println!(".align 8");
105+
println!("kallsyms_names:");
106+
107+
last_vaddr = 0;
108+
109+
for entry in symbol_table {
110+
if !symbol_to_write(entry.vaddr, text_vaddr, etext_vaddr) || entry.vaddr == last_vaddr {
111+
continue;
112+
}
113+
114+
println!("\t.asciz\t\"{}\"", entry.symbol);
115+
last_vaddr = entry.vaddr;
116+
}
117+
}
118+
119+
fn main() {
120+
let (symbol_table, text_vaddr, etext_vaddr) = read_map();
121+
generate_result(&symbol_table, text_vaddr, etext_vaddr);
122+
}

Diff for: dadk-manifest.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[metadata]
44
# Target architecture. Options: x86_64, riscv64
5-
arch = "x86_64"
5+
arch = "riscv64"
66

77
# Hypervisor config path
88
hypervisor-config = "config/hypervisor.toml"

Diff for: env.mk

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
ifeq ($(ARCH), )
33
# !!!!在这里设置ARCH,可选 x86_64 和 riscv64
44
# !!!!!!!如果不同时调整这里以及vscode的settings.json,那么自动补全和检查将会失效
5-
export ARCH?=x86_64
5+
export ARCH?=riscv64
66
endif
77

88
ifeq ($(EMULATOR), )

Diff for: kernel/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ ECHO:
1616
@echo "$@"
1717

1818
all:
19+
$(MAKE) -C ../build-scripts all
1920
$(MAKE) -C src all ARCH=$(ARCH) || (sh -c "echo 内核编译失败" && exit 1)
2021

2122

Diff for: kernel/src/arch/x86_64/driver/apic/c_adapter.rs

-10
This file was deleted.

Diff for: kernel/src/arch/x86_64/driver/apic/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use self::{
2121
};
2222

2323
pub mod apic_timer;
24-
mod c_adapter;
2524
pub mod hw_irq;
2625
pub mod ioapic;
2726
pub mod lapic_vector;

Diff for: kernel/src/arch/x86_64/mm/mod.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ pub mod pkru;
55

66
use alloc::sync::Arc;
77
use alloc::vec::Vec;
8-
use hashbrown::HashSet;
98
use log::{debug, info};
10-
use x86::time::rdtsc;
119
use x86_64::registers::model_specific::EferFlags;
1210

1311
use crate::driver::serial::serial8250::send_to_default_serial8250_port;
@@ -553,11 +551,10 @@ unsafe fn allocator_init() {
553551
debug!("Successfully enabled new page table");
554552
}
555553

556-
#[no_mangle]
557-
pub extern "C" fn rs_test_buddy() {
558-
test_buddy();
559-
}
554+
#[cfg(test)]
560555
pub fn test_buddy() {
556+
use hashbrown::HashSet;
557+
use x86::time::rdtsc;
561558
// 申请内存然后写入数据然后free掉
562559
// 总共申请200MB内存
563560
const TOTAL_SIZE: usize = 200 * 1024 * 1024;

Diff for: kernel/src/debug/Makefile

+2-5
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,11 @@ all:
44

55
CFLAGS += -I .
66

7-
gen_kallsyms: gen_kallsyms.rs
8-
rustc gen_kallsyms.rs
9-
107
# 生成内核栈符号表的汇编文件
11-
generate_kallsyms: gen_kallsyms
8+
generate_kallsyms:
129
@echo "Generating kallsyms..."
1310
# 请注意,这个不能使用raw的nm来处理
14-
nm -n -C $(kernel_root_path)/kernel | ./gen_kallsyms > kallsyms.S
11+
nm -n -C $(kernel_root_path)/kernel | $(kernel_root_path)/../../build-scripts/target/release/gen_kallsyms > kallsyms.S
1512
$(CC) -c kallsyms.S -o kallsyms.o
1613
@echo "Kallsyms generated."
1714

Diff for: kernel/src/driver/video/mod.rs

-7
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,3 @@ impl TimerFunction for VideoRefreshExecutor {
295295
return Ok(());
296296
}
297297
}
298-
299-
#[no_mangle]
300-
pub unsafe extern "C" fn rs_video_init() -> i32 {
301-
return VideoRefreshManager::video_init()
302-
.map(|_| 0)
303-
.unwrap_or_else(|e| e.to_posix_errno());
304-
}

Diff for: kernel/src/exception/softirq.rs

-5
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,6 @@ const MAX_SOFTIRQ_RESTART: i32 = 20;
2828
static mut __CPU_PENDING: Option<Box<[VecStatus; PerCpu::MAX_CPU_NUM as usize]>> = None;
2929
static mut __SORTIRQ_VECTORS: *mut Softirq = null_mut();
3030

31-
#[no_mangle]
32-
pub extern "C" fn rs_softirq_init() {
33-
softirq_init().expect("softirq_init failed");
34-
}
35-
3631
#[inline(never)]
3732
pub fn softirq_init() -> Result<(), SystemError> {
3833
info!("Initializing softirq...");

Diff for: kernel/src/libs/lib_ui/textui.rs

+1-67
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
use crate::{
2-
driver::{
3-
serial::serial8250::send_to_default_serial8250_port, tty::virtual_terminal::vc_manager,
4-
video::video_refresh_manager,
5-
},
2+
driver::{serial::serial8250::send_to_default_serial8250_port, video::video_refresh_manager},
63
libs::{
74
lib_ui::font::FONT_8x16,
85
rwlock::RwLock,
@@ -1017,69 +1014,6 @@ where
10171014
}
10181015
}
10191016

1020-
/// 在默认窗口上输出一个字符
1021-
/// ## 参数
1022-
/// - character 字符
1023-
/// - FRcolor 前景色(RGB)
1024-
/// - BKcolor 背景色(RGB)
1025-
#[no_mangle]
1026-
pub extern "C" fn rs_textui_putchar(character: u8, fr_color: u32, bk_color: u32) -> i32 {
1027-
if let Some(current_vc) = vc_manager().current_vc() {
1028-
// tty已经初始化了之后才输出到屏幕
1029-
let fr = (fr_color & 0x00ff0000) >> 16;
1030-
let fg = (fr_color & 0x0000ff00) >> 8;
1031-
let fb = fr_color & 0x000000ff;
1032-
let br = (bk_color & 0x00ff0000) >> 16;
1033-
let bg = (bk_color & 0x0000ff00) >> 8;
1034-
let bb = bk_color & 0x000000ff;
1035-
let buf = format!(
1036-
"\x1B[38;2;{fr};{fg};{fb};48;2;{br};{bg};{bb}m{}\x1B[0m",
1037-
character as char
1038-
);
1039-
let port = current_vc.port();
1040-
let tty = port.port_data().internal_tty();
1041-
if let Some(tty) = tty {
1042-
return tty
1043-
.write_to_core(buf.as_bytes(), buf.len())
1044-
.map(|_| 0)
1045-
.unwrap_or_else(|e| e.to_posix_errno());
1046-
}
1047-
}
1048-
return textui_putchar(
1049-
character as char,
1050-
FontColor::from(fr_color),
1051-
FontColor::from(bk_color),
1052-
)
1053-
.map(|_| 0)
1054-
.unwrap_or_else(|e| e.to_posix_errno());
1055-
}
1056-
1057-
pub fn textui_putchar(
1058-
character: char,
1059-
fr_color: FontColor,
1060-
bk_color: FontColor,
1061-
) -> Result<(), SystemError> {
1062-
if unsafe { TEXTUI_IS_INIT } {
1063-
return textui_framework()
1064-
.current_window
1065-
.lock_irqsave()
1066-
.textui_putchar_window(
1067-
character,
1068-
fr_color,
1069-
bk_color,
1070-
textui_is_enable_put_to_window(),
1071-
);
1072-
} else {
1073-
//未初始化暴力输出
1074-
return no_init_textui_putchar_window(
1075-
character,
1076-
fr_color,
1077-
bk_color,
1078-
textui_is_enable_put_to_window(),
1079-
);
1080-
}
1081-
}
1082-
10831017
/// 向默认窗口输出一个字符串
10841018
pub fn textui_putstr(
10851019
string: &str,

0 commit comments

Comments
 (0)