1#![no_std]
2
3pub trait ModifyRegister {
4 fn get() -> usize;
6 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 unsafe {
42 core::arch::asm!("msr tpidr_el0,{}",in(reg) val);
43 }
44 }
45 }
46}
47
48#[cfg(any(target_arch = "riscv64", target_arch = "riscv32"))]
49impl ModifyRegister for ThreadRegister {
50 fn get() -> usize {
51 let val: usize;
52 unsafe {
53 core::arch::asm!("mv {}, tp",out(reg) val);
54 }
55 val
56 }
57
58 unsafe fn set(value: usize) {
59 unsafe {
60 core::arch::asm!("mv tp,{}",in(reg) value);
61 }
62 }
63}