archctl: ARCH_CTL_GET_GSBASE ARCH_CTL_GET_FSBASE

This commit is contained in:
Matheus
2025-02-08 20:12:21 -03:00
parent 8c42826cf1
commit 569818697e
+16 -4
View File
@@ -2,8 +2,14 @@
#include <arch/msr.h>
#include <errno.h>
#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;