Bladeren bron

feat(hal): impl percpu for riscv64

Heinz 8 maanden geleden
bovenliggende
commit
c0f4799102

+ 1 - 0
arch/arch_macros/src/lib.rs

@@ -1 +1,2 @@
 pub mod x86_64;
+pub mod riscv64;

+ 1 - 0
arch/arch_macros/src/riscv64/mod.rs

@@ -0,0 +1 @@
+pub mod percpu;

+ 19 - 0
arch/arch_macros/src/riscv64/percpu.rs

@@ -0,0 +1,19 @@
+use proc_macro2::TokenStream;
+use quote::quote;
+use syn::{Ident, Type};
+
+/// Get the base address for percpu variables of the current thread.
+pub fn get_percpu_pointer(percpu: &Ident, ty: &Type) -> TokenStream {
+    quote! {
+        {
+            let base: *mut #ty;
+            ::core::arch::asm!(
+                "addi {base}, tp, {offset}",
+                base = out(reg) base,
+                offset = sym #percpu,
+                options(nostack, preserves_flags)
+            );
+            base
+        }
+    }
+}

+ 26 - 0
crates/eonix_percpu/eonix_percpu_macros/src/lib.rs

@@ -208,3 +208,29 @@ pub fn define_percpu_shared_x86_64(
     )
     .into()
 }
+
+#[proc_macro_attribute]
+pub fn define_percpu_riscv64(
+    attrs: proc_macro::TokenStream,
+    item: proc_macro::TokenStream,
+) -> proc_macro::TokenStream {
+    define_percpu_impl(
+        attrs.into(),
+        item.into(),
+        arch_macros::riscv64::percpu::get_percpu_pointer,
+    )
+    .into()
+}
+
+#[proc_macro_attribute]
+pub fn define_percpu_shared_riscv64(
+    attrs: proc_macro::TokenStream,
+    item: proc_macro::TokenStream,
+) -> proc_macro::TokenStream {
+    define_percpu_shared_impl(
+        attrs.into(),
+        item.into(),
+        arch_macros::riscv64::percpu::get_percpu_pointer,
+    )
+    .into()
+}

+ 6 - 0
crates/eonix_percpu/src/lib.rs

@@ -12,6 +12,12 @@ pub use eonix_percpu_macros::define_percpu_x86_64 as define_percpu;
 #[cfg(target_arch = "x86_64")]
 pub use eonix_percpu_macros::define_percpu_shared_x86_64 as define_percpu_shared;
 
+#[cfg(target_arch = "riscv64")]
+pub use eonix_percpu_macros::define_percpu_riscv64 as define_percpu;
+
+#[cfg(target_arch = "riscv64")]
+pub use eonix_percpu_macros::define_percpu_shared_riscv64 as define_percpu_shared;
+
 const MAX_CPUS: usize = 256;
 
 #[repr(align(16))]