瀏覽代碼

Kernel: Add read_gs_value() and write_gs_value()

Co-authored-by: Tom <tomut@yahoo.com>
Andreas Kling 3 年之前
父節點
當前提交
249d6a490d
共有 1 個文件被更改,包括 19 次插入0 次删除
  1. 19 0
      Kernel/Arch/x86/ASM_wrapper.h

+ 19 - 0
Kernel/Arch/x86/ASM_wrapper.h

@@ -62,6 +62,25 @@ ALWAYS_INLINE u16 get_gs()
 }
 }
 #endif
 #endif
 
 
+template<typename T>
+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<typename T>
+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)
 ALWAYS_INLINE FlatPtr read_gs_ptr(FlatPtr offset)
 {
 {
     FlatPtr val;
     FlatPtr val;