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 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}