diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index d18d22f02..46c6b8899 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -15,7 +15,7 @@ members = [ ] [features] -default = ["backtrace", "kvm", "fatfs", "fatfs-secure"] +default = ["backtrace", "kvm", "fatfs", "fatfs-secure", "static_keys_test"] # 内核栈回溯 backtrace = [] # kvm @@ -27,6 +27,7 @@ driver_ps2_mouse = [] # kprobe kprobe_test = [] +static_keys_test = [] # 运行时依赖项 [dependencies] @@ -67,6 +68,8 @@ lru = "0.12.3" rbpf = { path = "crates/rbpf" } printf-compat = { version = "0.1.1", default-features = false } +static-keys = "=0.6.1" + # target为x86_64时,使用下面的依赖 [target.'cfg(target_arch = "x86_64")'.dependencies] mini-backtrace = { git = "https://git.mirrors.dragonos.org.cn/DragonOS-Community/mini-backtrace.git", rev = "e0b1d90940" } diff --git a/kernel/src/debug/jump_label.rs b/kernel/src/debug/jump_label.rs new file mode 100644 index 000000000..2298f6d14 --- /dev/null +++ b/kernel/src/debug/jump_label.rs @@ -0,0 +1,28 @@ +#[cfg(feature = "static_keys_test")] +mod tests { + use static_keys::{define_static_key_false, static_branch_unlikely}; + define_static_key_false!(MY_STATIC_KEY); + #[inline(always)] + fn foo() { + println!("Entering foo function"); + if static_branch_unlikely!(MY_STATIC_KEY) { + println!("A branch"); + } else { + println!("B branch"); + } + } + + pub(super) fn static_keys_test() { + foo(); + unsafe { + MY_STATIC_KEY.enable(); + } + foo(); + } +} + +pub fn static_keys_init() { + static_keys::global_init(); + #[cfg(feature = "static_keys_test")] + tests::static_keys_test(); +} diff --git a/kernel/src/debug/mod.rs b/kernel/src/debug/mod.rs index b24c48bc9..085d70517 100644 --- a/kernel/src/debug/mod.rs +++ b/kernel/src/debug/mod.rs @@ -1,2 +1,3 @@ +pub mod jump_label; pub mod klog; pub mod kprobe; diff --git a/kernel/src/init/init.rs b/kernel/src/init/init.rs index 653e2f4db..fa77cba7b 100644 --- a/kernel/src/init/init.rs +++ b/kernel/src/init/init.rs @@ -57,6 +57,7 @@ fn do_start_kernel() { unsafe { mm_init() }; + // crate::debug::jump_label::static_keys_init(); if scm_reinit().is_ok() { if let Err(e) = textui_init() { warn!("Failed to init textui: {:?}", e); @@ -90,6 +91,7 @@ fn do_start_kernel() { clocksource_boot_finish(); Futex::init(); crate::bpf::init_bpf_system(); + crate::debug::jump_label::static_keys_init(); #[cfg(all(target_arch = "x86_64", feature = "kvm"))] crate::virt::kvm::kvm_init(); } diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index c35cc12bc..0c9ccbe4f 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -17,6 +17,7 @@ #![feature(sync_unsafe_cell)] #![feature(vec_into_raw_parts)] #![feature(c_variadic)] +#![feature(asm_goto)] #![cfg_attr(target_os = "none", no_std)] #![allow(static_mut_refs, non_local_definitions, internal_features)] // clippy的配置