signal: fix handling of fpu and some more small things

This commit is contained in:
Matheus
2025-02-08 20:16:15 -03:00
parent c34021e4d6
commit d119d7123b
2 changed files with 8 additions and 10 deletions
+4 -8
View File
@@ -36,7 +36,7 @@
typedef struct {
unsigned long gregs[MCONTEXT_NGREG];
uint8_t fpu_state[512];
uint8_t *fpu_state_p;
unsigned long __reserved1[8];
} mcontext_t;
@@ -60,11 +60,10 @@ typedef struct {
#define ARCH_SIGFRAME_GET_UCONTEXT_POINTER(x) (&(x)->uc_flags)
static inline void arch_sigframe_prepare_mcontext(sigframe_t *sigframe) {
static inline void arch_sigframe_prepare_mcontext(void *stack, sigframe_t *sigframe) {
context_t *context = &sigframe->context;
extracontext_t *extracontext = &sigframe->extracontext;
unsigned long *gregs = sigframe->mcontext.gregs;
uint8_t *fpu_state = sigframe->mcontext.fpu_state;
gregs[MCONTEXT_REG_R8] = context->r8;
gregs[MCONTEXT_REG_R9] = context->r9;
@@ -86,18 +85,17 @@ static inline void arch_sigframe_prepare_mcontext(sigframe_t *sigframe) {
gregs[MCONTEXT_REG_EFL] = context->rflags;
gregs[MCONTEXT_REG_CSGSFS] = 0;
gregs[MCONTEXT_REG_ERR] = context->error;
gregs[MCONTEXT_REG_TRAPNO] = 0;
gregs[MCONTEXT_REG_TRAPNO] = context->irq;
gregs[MCONTEXT_REG_OLDMASK] = 0;
gregs[MCONTEXT_REG_CR2] = context->cr2;
memcpy(fpu_state, extracontext->fx, 512);
sigframe->mcontext.fpu_state_p = &((sigframe_t *)stack)->extracontext.fx;
}
static inline void arch_sigframe_get_context_from_mcontext(sigframe_t *sigframe) {
context_t *context = &sigframe->context;
extracontext_t *extracontext = &sigframe->extracontext;
unsigned long *gregs = sigframe->mcontext.gregs;
uint8_t *fpu_state = sigframe->mcontext.fpu_state;
context->r8 = gregs[MCONTEXT_REG_R8];
context->r9 = gregs[MCONTEXT_REG_R9];
@@ -119,8 +117,6 @@ static inline void arch_sigframe_get_context_from_mcontext(sigframe_t *sigframe)
context->rflags = gregs[MCONTEXT_REG_EFL];
context->error = gregs[MCONTEXT_REG_ERR];
context->cr2 = gregs[MCONTEXT_REG_CR2];
memcpy(extracontext->fx, fpu_state, 512);
}
+4 -2
View File
@@ -569,12 +569,14 @@ bool signal_check(struct thread_t *thread, context_t *context, bool syscall, uin
memcpy(&sigframe.context, context, sizeof(context_t));
memcpy(&sigframe.extracontext, &thread->extracontext, sizeof(extracontext_t));
arch_sigframe_prepare_mcontext(&sigframe);
arch_sigframe_prepare_mcontext(stack, &sigframe);
memset(&sigframe.siginfo, 0, sizeof(siginfo_t));
if (signal == SIGSEGV)
sigframe.siginfo.__si_fields.__sigfault.si_addr = CTX_TRAP_ADDR(context);
if (usercopy_touser(stack, &sigframe, sizeof(sigframe_t))) {
printf("signal: bad user stack %p\n", stack);
printf("signal: bad user stack %p (altstack %p) handling signal %d trapno %lu\n", stack, altstack, signal, sigframe.mcontext.gregs[MCONTEXT_REG_TRAPNO]);
THREAD_LEAVE(thread);
PROCESS_LEAVE(proc);
interrupt_set(true);