From c20d0e790f93623eb34c873dc294d0b6bb3f719d Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 8 Jul 2023 22:54:34 -0300 Subject: [PATCH] scheduler: umask default value and fpu saving in x86_64 context --- kernel-src/include/x86-64/arch/context.h | 17 ++++++++++++++--- kernel-src/sys/scheduler.c | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/kernel-src/include/x86-64/arch/context.h b/kernel-src/include/x86-64/arch/context.h index 266e2d15..02e4b1c9 100644 --- a/kernel-src/include/x86-64/arch/context.h +++ b/kernel-src/include/x86-64/arch/context.h @@ -40,7 +40,9 @@ typedef struct { typedef struct { uint64_t gsbase; uint64_t fsbase; -} extracontext_t; + uint8_t fx[512]; + uint32_t mxcsr; +} extracontext_t __attribute__((aligned(16))); #define CTX_INIT(x,u) \ if (u) { \ @@ -52,6 +54,9 @@ typedef struct { } \ (x)->rflags = 0x200; +#define CTX_XINIT(x, u) \ + (x)->mxcsr = 0x1F80; // all exceptions masked + #define CTX_SP(x) (x)->rsp #define CTX_IP(x) (x)->rip #define CTX_RET(x) (x)->rax @@ -73,18 +78,24 @@ void arch_context_saveandcall(void (*fn)(context_t *context), void *stack); _cpu()->ist.rsp0 = (uint64_t)(x)->kernelstacktop; \ wrmsr(MSR_KERNELGSBASE, (x)->extracontext.gsbase); \ wrmsr(MSR_FSBASE, (x)->extracontext.fsbase); \ + asm("fxrstor (%%rax)" : : "a"(&(x)->extracontext.fx[0])); \ + asm("ldmxcsr (%%rax)" : : "a"(&(x)->extracontext.mxcsr)); \ arch_context_switch(&thread->context); #define ARCH_CONTEXT_THREADSAVE(t, c) \ memcpy(&(t)->context, c, sizeof(context_t)); \ (t)->extracontext.gsbase = rdmsr(MSR_KERNELGSBASE); \ - (t)->extracontext.fsbase = rdmsr(MSR_FSBASE); + (t)->extracontext.fsbase = rdmsr(MSR_FSBASE); \ + asm("fxsave (%%rax)" : : "a"(&(t)->extracontext.fx[0])); \ + asm("stmxcsr (%%rax)" : : "a"(&(t)->extracontext.mxcsr)); #define ARCH_CONTEXT_THREADLOAD(t, c) \ memcpy(c, &(t)->context, sizeof(context_t)); \ _cpu()->ist.rsp0 = (uint64_t)(t)->kernelstacktop; \ wrmsr(MSR_KERNELGSBASE, (t)->extracontext.gsbase); \ - wrmsr(MSR_FSBASE, (t)->extracontext.fsbase); + wrmsr(MSR_FSBASE, (t)->extracontext.fsbase); \ + asm("fxrstor (%%rax)" : : "a"(&(t)->extracontext.fx[0])); \ + asm("ldmxcsr (%%rax)" : : "a"(&(t)->extracontext.mxcsr)); #define ARCH_CONTEXT_INTSTATUS(x) ((x)->rflags & 0x200 ? true : false) diff --git a/kernel-src/sys/scheduler.c b/kernel-src/sys/scheduler.c index e6ae69e4..9dc80f43 100644 --- a/kernel-src/sys/scheduler.c +++ b/kernel-src/sys/scheduler.c @@ -60,6 +60,7 @@ proc_t *sched_newproc() { } proc->pid = __atomic_fetch_add(&currpid, 1, __ATOMIC_SEQ_CST); + proc->umask = 022; // default umask return proc; } @@ -86,6 +87,7 @@ thread_t *sched_newthread(void *ip, size_t kstacksize, int priority, proc_t *pro CTX_INIT(&thread->context, proc != NULL); + CTX_XINIT(&thread->extracontext, proc != NULL); CTX_SP(&thread->context) = proc ? (ctxreg_t)ustack : (ctxreg_t)thread->kernelstacktop; CTX_IP(&thread->context) = (ctxreg_t)ip; SPINLOCK_INIT(thread->sleeplock);