bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 3/3] x86_64: add a critical section on entry and exit from sy


From: Samuel Thibault
Subject: Re: [PATCH 3/3] x86_64: add a critical section on entry and exit from syscall/sysret
Date: Sat, 17 Jun 2023 23:18:39 +0200
User-agent: NeoMutt/20170609 (1.8.3)

Applied, thanks!

Luca Dariz, le jeu. 15 juin 2023 23:49:31 +0200, a ecrit:
> When entering a syscall we're still using the user stack, so we can't
> reliably handle exceptions or interrupts, otherwise a user thread can
> easily crash the machine with an invalid stack. Instead, disable
> interrupts and (hopefullly) avoid traps in the fragments where we need
> to have the user stack in RSP.
> 
> * i386/i386/ldt.c: mask interrupts and IOPL on syscall entry
> * x86_64/locore.S: keep interrupts disabled when we use the user stack
> ---
>  i386/i386/ldt.c | 3 ++-
>  x86_64/locore.S | 4 +++-
>  2 files changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/i386/i386/ldt.c b/i386/i386/ldt.c
> index 4d7ec19a..5db36426 100644
> --- a/i386/i386/ldt.c
> +++ b/i386/i386/ldt.c
> @@ -27,6 +27,7 @@
>   * "Local" descriptor table.  At the moment, all tasks use the
>   * same LDT.
>   */
> +#include <mach/machine/eflags.h>
>  #include <mach/machine/vm_types.h>
>  #include <mach/xen.h>
>  
> @@ -75,7 +76,7 @@ ldt_fill(struct real_descriptor *myldt, struct 
> real_descriptor *mygdt)
>          wrmsr(MSR_REG_EFER, rdmsr(MSR_REG_EFER) | MSR_EFER_SCE);
>          wrmsr(MSR_REG_LSTAR, (vm_offset_t)syscall64);
>          wrmsr(MSR_REG_STAR, ((((long)USER_CS - 16) << 16) | (long)KERNEL_CS) 
> << 32);
> -        wrmsr(MSR_REG_FMASK, 0);  // ?
> +        wrmsr(MSR_REG_FMASK, EFL_IF | EFL_IOPL_USER);
>  #else /* defined(__x86_64__) && ! defined(USER32) */
>       fill_ldt_gate(myldt, USER_SCALL,
>                     (vm_offset_t)&syscall, KERNEL_CS,
> diff --git a/x86_64/locore.S b/x86_64/locore.S
> index a6697fb9..16b0dde5 100644
> --- a/x86_64/locore.S
> +++ b/x86_64/locore.S
> @@ -1405,9 +1405,10 @@ ENTRY(syscall64)
>       mov     %r11,%rbx               /* prepare for error handling */
>       mov     %r10,%rcx               /* fix arg3 location according to C ABI 
> */
>  
> -     /* switch to kernel stack */
> +     /* switch to kernel stack, then we can enable interrupts */
>       CPU_NUMBER(%r11)
>       movq    CX(EXT(kernel_stack),%r11),%rsp
> +     sti
>  
>       /* Now we have saved state and args 1-6 are in place.
>        * Before invoking the syscall we do some bound checking and,
> @@ -1468,6 +1469,7 @@ _syscall64_check_for_ast:
>  
>  _syscall64_restore_state:
>       /* Restore thread state and return to user using sysret. */
> +     cli     /* block interrupts when using the user stack in kernel space */
>       movq    CX(EXT(active_threads),%r11),%r11 /* point to current thread */
>       movq    TH_PCB(%r11),%r11               /* point to pcb */
>       addq    $ PCB_ISS,%r11                  /* point to saved state */
> -- 
> 2.39.2
> 
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]