From 569818697e1fa55b1b326397fefd33ea12006ab5 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 8 Feb 2025 20:12:21 -0300 Subject: [PATCH] archctl: ARCH_CTL_GET_GSBASE ARCH_CTL_GET_FSBASE --- kernel-src/arch/x86-64/archctl.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/kernel-src/arch/x86-64/archctl.c b/kernel-src/arch/x86-64/archctl.c index 26ba5f3e..249cc272 100644 --- a/kernel-src/arch/x86-64/archctl.c +++ b/kernel-src/arch/x86-64/archctl.c @@ -2,8 +2,14 @@ #include #include -#define ARCH_CTL_GSBASE 0 -#define ARCH_CTL_FSBASE 1 +#define ARCH_CTL_SET_GSBASE 0 +#define ARCH_CTL_SET_FSBASE 1 +#define ARCH_CTL_GET_GSBASE 2 +#define ARCH_CTL_GET_FSBASE 3 + +static inline int copy_u64_to_user(void *ptr, uint64_t v) { + return usercopy_touser(ptr, &v, sizeof(v)); +} syscallret_t syscall_archctl(context_t *context, int func, void *arg) { syscallret_t ret = { @@ -12,13 +18,19 @@ syscallret_t syscall_archctl(context_t *context, int func, void *arg) { }; switch (func) { - case ARCH_CTL_GSBASE: + case ARCH_CTL_SET_GSBASE: // kernelgsbase because it will be switched out to user wrmsr(MSR_KERNELGSBASE, (uint64_t)arg); break; - case ARCH_CTL_FSBASE: + case ARCH_CTL_SET_FSBASE: wrmsr(MSR_FSBASE, (uint64_t)arg); break; + case ARCH_CTL_GET_GSBASE: + ret.errno = copy_u64_to_user(arg, rdmsr(MSR_KERNELGSBASE)); + break; + case ARCH_CTL_GET_FSBASE: + ret.errno = copy_u64_to_user(arg, rdmsr(MSR_FSBASE)); + break; default: ret.errno = EINVAL; break;