diff --git a/Kernel/Arch/x86/ASM_wrapper.h b/Kernel/Arch/x86/ASM_wrapper.h index 9bb508d515..187a1649d7 100644 --- a/Kernel/Arch/x86/ASM_wrapper.h +++ b/Kernel/Arch/x86/ASM_wrapper.h @@ -62,6 +62,25 @@ ALWAYS_INLINE u16 get_gs() } #endif +template +ALWAYS_INLINE T read_gs_value(FlatPtr offset) +{ + T val; + asm volatile( + "mov %%gs:%a[off], %[val]" + : [val] "=r"(val) + : [off] "ir"(offset)); + return val; +} + +template +ALWAYS_INLINE void write_gs_value(FlatPtr offset, T val) +{ + asm volatile( + "mov %[val], %%gs:%a[off]" ::[off] "ir"(offset), [val] "r"(val) + : "memory"); +} + ALWAYS_INLINE FlatPtr read_gs_ptr(FlatPtr offset) { FlatPtr val;