x86-64: enable smep and smap

This commit is contained in:
Matheus
2026-04-23 15:29:43 -03:00
parent b0542a165c
commit 71dd6d1125
9 changed files with 100 additions and 4 deletions
+16 -3
View File
@@ -4,6 +4,8 @@
#include <kernel/alloc.h>
#include <util.h>
#include <kernel/vmm.h>
#include <kernel/usercopy.h>
#include <arch/cpu.h>
#ifdef __x86_64__
#define ARCH_ELF_BITS 2
@@ -72,7 +74,10 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
if (error)
return error;
memset(page, 0, firstpageoffset);
error = usercopy_memset(page, 0, firstpageoffset);
if (error)
return error;
mempos += firstpagecount;
msize -= firstpagecount;
fsize -= firstpagecount;
@@ -85,7 +90,10 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
if (remainingmsize > ROUND_UP(mempos, PAGE_SIZE) - mempos)
remainingmsize = pagediff;
memset((void *)mempos, 0, remainingmsize);
error = usercopy_memset((void *)mempos, 0, remainingmsize);
if (error)
return error;
msize -= remainingmsize;
mempos += remainingmsize;
}
@@ -121,7 +129,10 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
if (error)
return error;
memset((void *)(mempos + lastpagecount), 0, PAGE_SIZE - lastpagecount);
error = usercopy_memset((void *)(mempos + lastpagecount), 0, PAGE_SIZE - lastpagecount);
if (error)
return error;
msize -= msize > PAGE_SIZE ? PAGE_SIZE : msize;
error = vmm_changemmuflags((void *)mempos, PAGE_SIZE, mmuflags, 0);
@@ -266,6 +277,7 @@ void *elf_preparestack(void *top, auxv64list_t *auxv64, char **argv, char **envp
char **argstart = (char **)envstart - argc - 1;
size_t *argcptr = (size_t *)argstart - 1;
arch_cpu_user_access_begin();
auxv64->execfn.type = AT_EXECFN;
auxv64->execfn.val = (uint64_t)pathdatastart;
@@ -289,5 +301,6 @@ void *elf_preparestack(void *top, auxv64list_t *auxv64, char **argv, char **envp
*envstart = NULL;
*argcptr = argc;
arch_cpu_user_access_end();
return argcptr;
}
+3
View File
@@ -29,7 +29,10 @@ __attribute__((noreturn)) void syscall_sigreturn(context_t *context) {
__assert(ARCH_CONTEXT_ISUSER(&sigframe->context));
// XXX TODO FIXME there is a bug here that needs this temporarily.
arch_cpu_user_access_begin();
arch_extracontext_copy(&current_thread()->extracontext, &sigframe->extracontext);
arch_cpu_user_access_end();
ARCH_CONTEXT_THREADLOAD(current_thread(), context);
arch_context_switch(&sigframe->context);