فهرست منبع

feat(debug)[WIP]: add static-keys support (#1025)

* feat: add static-keys support
linfeng 4 ماه پیش
والد
کامیت
750b3b5d91
5فایلهای تغییر یافته به همراه36 افزوده شده و 1 حذف شده
  1. 4 1
      kernel/Cargo.toml
  2. 28 0
      kernel/src/debug/jump_label.rs
  3. 1 0
      kernel/src/debug/mod.rs
  4. 2 0
      kernel/src/init/init.rs
  5. 1 0
      kernel/src/lib.rs

+ 4 - 1
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" }

+ 28 - 0
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();
+}

+ 1 - 0
kernel/src/debug/mod.rs

@@ -1,2 +1,3 @@
+pub mod jump_label;
 pub mod klog;
 pub mod kprobe;

+ 2 - 0
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();
 }

+ 1 - 0
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的配置