From d08f7b1dee825d1a527fca6893bdcf7f855143ea Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 2 May 2026 18:29:07 +0300 Subject: [PATCH] Kernel: Cleanup inline assembly accessing cpu specific data --- kernel/include/kernel/Processor.h | 37 +++++++------------------------ 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/kernel/include/kernel/Processor.h b/kernel/include/kernel/Processor.h index f86fe580..77ab6ae5 100644 --- a/kernel/include/kernel/Processor.h +++ b/kernel/include/kernel/Processor.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -139,11 +140,7 @@ namespace Kernel static void disable_sse() { uintptr_t dummy; -#if ARCH(x86_64) - asm volatile("movq %%cr0, %0; orq $0x08, %0; movq %0, %%cr0" : "=r"(dummy)); -#elif ARCH(i686) - asm volatile("movl %%cr0, %0; orl $0x08, %0; movl %0, %%cr0" : "=r"(dummy)); -#endif + asm volatile("mov %%cr0, %0; or $0x08, %0; mov %0, %%cr0" : "=r"(dummy)); } static void enable_sse() @@ -168,35 +165,17 @@ namespace Kernel } template - static T read_gs_sized(uintptr_t offset) requires(sizeof(T) <= 8) + static T read_gs_sized(uintptr_t offset) requires(sizeof(T) <= 8 && BAN::Math::is_power_of_two(sizeof(T))) { -#define __ASM_INPUT(operation) asm volatile(operation " %%gs:%a[offset], %[result]" : [result]"=r"(result) : [offset]"ir"(offset)) - T result; - if constexpr(sizeof(T) == 8) - __ASM_INPUT("movq"); - if constexpr(sizeof(T) == 4) - __ASM_INPUT("movl"); - if constexpr(sizeof(T) == 2) - __ASM_INPUT("movw"); - if constexpr(sizeof(T) == 1) - __ASM_INPUT("movb"); - return result; -#undef __ASM_INPUT + T value; + asm volatile("mov %%gs:%a[offset], %[value]" : [value]"=r"(value) : [offset]"ir"(offset)); + return value; } template - static void write_gs_sized(uintptr_t offset, T value) requires(sizeof(T) <= 8) + static void write_gs_sized(uintptr_t offset, T value) requires(sizeof(T) <= 8 && BAN::Math::is_power_of_two(sizeof(T))) { -#define __ASM_INPUT(operation) asm volatile(operation " %[value], %%gs:%a[offset]" :: [value]"r"(value), [offset]"ir"(offset) : "memory") - if constexpr(sizeof(T) == 8) - __ASM_INPUT("movq"); - if constexpr(sizeof(T) == 4) - __ASM_INPUT("movl"); - if constexpr(sizeof(T) == 2) - __ASM_INPUT("movw"); - if constexpr(sizeof(T) == 1) - __ASM_INPUT("movb"); -#undef __ASM_INPUT + asm volatile("mov %[value], %%gs:%a[offset]" :: [value]"r"(value), [offset]"ir"(offset) : "memory"); } private: