lkml.org 
[lkml]   [2023]   [Mar]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC PATCH V3 12/16] x86/sev: Add a #HV exception handler
    On Sat, Jan 21, 2023 at 09:46:02PM -0500, Tianyu Lan wrote:
    > From: Tianyu Lan <tiala@microsoft.com>
    >
    > Add a #HV exception handler that uses IST stack.
    >
    > Signed-off-by: Tianyu Lan <tiala@microsoft.com>
    > ---
    > Change since RFC V2:
    > * Remove unnecessary line in the change log.
    > ---
    > arch/x86/entry/entry_64.S | 58 +++++++++++++++++++++++++++
    > arch/x86/include/asm/cpu_entry_area.h | 6 +++
    > arch/x86/include/asm/idtentry.h | 39 +++++++++++++++++-
    > arch/x86/include/asm/page_64_types.h | 1 +
    > arch/x86/include/asm/trapnr.h | 1 +
    > arch/x86/include/asm/traps.h | 1 +
    > arch/x86/kernel/cpu/common.c | 1 +
    > arch/x86/kernel/dumpstack_64.c | 9 ++++-
    > arch/x86/kernel/idt.c | 1 +
    > arch/x86/kernel/sev.c | 53 ++++++++++++++++++++++++
    > arch/x86/kernel/traps.c | 40 ++++++++++++++++++
    > arch/x86/mm/cpu_entry_area.c | 2 +
    > 12 files changed, 209 insertions(+), 3 deletions(-)
    >
    > diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
    > index 15739a2c0983..6baec7653f19 100644
    > --- a/arch/x86/entry/entry_64.S
    > +++ b/arch/x86/entry/entry_64.S
    > @@ -563,6 +563,64 @@ SYM_CODE_START(\asmsym)
    > .Lfrom_usermode_switch_stack_\@:
    > idtentry_body user_\cfunc, has_error_code=1
    >
    > +_ASM_NOKPROBE(\asmsym)
    > +SYM_CODE_END(\asmsym)
    > +.endm
    > +/*
    > + * idtentry_hv - Macro to generate entry stub for #HV
    > + * @vector: Vector number
    > + * @asmsym: ASM symbol for the entry point
    > + * @cfunc: C function to be called
    > + *
    > + * The macro emits code to set up the kernel context for #HV. The #HV handler
    > + * runs on an IST stack and needs to be able to support nested #HV exceptions.
    > + *
    > + * To make this work the #HV entry code tries its best to pretend it doesn't use
    > + * an IST stack by switching to the task stack if coming from user-space (which
    > + * includes early SYSCALL entry path) or back to the stack in the IRET frame if
    > + * entered from kernel-mode.
    > + *
    > + * If entered from kernel-mode the return stack is validated first, and if it is
    > + * not safe to use (e.g. because it points to the entry stack) the #HV handler
    > + * will switch to a fall-back stack (HV2) and call a special handler function.
    > + *
    > + * The macro is only used for one vector, but it is planned to be extended in
    > + * the future for the #HV exception.
    > + */
    > +.macro idtentry_hv vector asmsym cfunc
    > +SYM_CODE_START(\asmsym)

    ...

    why is this so much duplicated code instead of sharing it with
    idtentry_vc and all the facilities it does?

    > + UNWIND_HINT_IRET_REGS
    > + ASM_CLAC
    > + pushq $-1 /* ORIG_RAX: no syscall to restart */
    > +
    > + testb $3, CS-ORIG_RAX(%rsp)
    > + jnz .Lfrom_usermode_switch_stack_\@
    > +
    > + call paranoid_entry
    > +
    > + UNWIND_HINT_REGS
    > +
    > + /*
    > + * Switch off the IST stack to make it free for nested exceptions.
    > + */
    > + movq %rsp, %rdi /* pt_regs pointer */
    > + call hv_switch_off_ist
    > + movq %rax, %rsp /* Switch to new stack */
    > +
    > + UNWIND_HINT_REGS
    > +
    > + /* Update pt_regs */
    > + movq ORIG_RAX(%rsp), %rsi /* get error code into 2nd argument*/
    > + movq $-1, ORIG_RAX(%rsp) /* no syscall to restart */
    > +
    > + movq %rsp, %rdi /* pt_regs pointer */
    > + call kernel_\cfunc
    > +
    > + jmp paranoid_exit
    > +
    > +.Lfrom_usermode_switch_stack_\@:
    > + idtentry_body user_\cfunc, has_error_code=1
    > +
    > _ASM_NOKPROBE(\asmsym)
    > SYM_CODE_END(\asmsym)
    > .endm
    > diff --git a/arch/x86/include/asm/cpu_entry_area.h b/arch/x86/include/asm/cpu_entry_area.h
    > index 462fc34f1317..2186ed601b4a 100644
    > --- a/arch/x86/include/asm/cpu_entry_area.h
    > +++ b/arch/x86/include/asm/cpu_entry_area.h
    > @@ -30,6 +30,10 @@
    > char VC_stack[optional_stack_size]; \
    > char VC2_stack_guard[guardsize]; \
    > char VC2_stack[optional_stack_size]; \
    > + char HV_stack_guard[guardsize]; \
    > + char HV_stack[optional_stack_size]; \
    > + char HV2_stack_guard[guardsize]; \
    > + char HV2_stack[optional_stack_size]; \
    > char IST_top_guard[guardsize]; \
    >
    > /* The exception stacks' physical storage. No guard pages required */
    > @@ -52,6 +56,8 @@ enum exception_stack_ordering {
    > ESTACK_MCE,
    > ESTACK_VC,
    > ESTACK_VC2,
    > + ESTACK_HV,
    > + ESTACK_HV2,
    > N_EXCEPTION_STACKS

    Ditto.

    And so on...

    Please share code - not duplicate.

    --
    Regards/Gruss,
    Boris.

    https://people.kernel.org/tglx/notes-about-netiquette

    \
     
     \ /
      Last update: 2023-03-31 17:58    [W:2.883 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site