thread_register/
lib.rs

1#![no_std]
2
3pub trait ModifyRegister {
4    /// Get thread register value
5    fn get() -> usize;
6    /// Set thread register value
7    unsafe fn set(value: usize);
8}
9
10pub struct ThreadRegister;
11
12#[cfg(target_arch = "x86_64")]
13impl ModifyRegister for ThreadRegister {
14    fn get() -> usize {
15        let val: usize;
16        unsafe {
17            core::arch::asm!("mov {}, fs:0",out(reg) val);
18        }
19        val
20    }
21
22    unsafe fn set(value: usize) {
23        unsafe {
24            core::arch::asm!("mov fs:0,{}",in(reg) value);
25        }
26    }
27}
28
29#[cfg(target_arch = "aarch64")]
30impl ModifyRegister for ThreadRegister {
31    fn get() -> usize {
32        let val: usize;
33        unsafe {
34            core::arch::asm!("mrs {},tpidr_el0",out(reg) val);
35        }
36        val
37    }
38
39    unsafe fn set(value: usize) {
40        unsafe {
41            core::arch::asm!("msr tpidr_el0,{}",in(reg) value);
42        }
43    }
44}
45
46#[cfg(any(target_arch = "riscv64", target_arch = "riscv32"))]
47impl ModifyRegister for ThreadRegister {
48    fn get() -> usize {
49        let val: usize;
50        unsafe {
51            core::arch::asm!("mv {}, tp",out(reg) val);
52        }
53        val
54    }
55
56    unsafe fn set(value: usize) {
57        unsafe {
58            core::arch::asm!("mv tp,{}",in(reg) value);
59        }
60    }
61}