On Fri, Jan 27, 2023 at 11:13:38PM +1100, Alexey Kardashevskiy wrote: > > This is broken, and building with DEBUG_ENTRY=y would've told you. > > > Huh, good to know. Is this it telling me so? > > vmlinux.o: warning: objtool: exc_nmi+0x73: call to native_get_debugreg7() > leaves .noinstr.text section > Yep. The ramification of all that is that by calling non-noinstr code (double negative, iow, regular instrumented code) is that you can end up in the tracers/*SAN/breakpoints etc.. code -- something we're very much not ready for at this point. > > > + > > > #ifdef CONFIG_CPU_SUP_AMD > > > extern void set_dr_addr_mask(unsigned long mask, int dr); > > > #else > > > diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c > > > index cec0bfa3bc04..400b5b6b74f6 100644 > > > --- a/arch/x86/kernel/nmi.c > > > +++ b/arch/x86/kernel/nmi.c > > > @@ -503,7 +503,7 @@ DEFINE_IDTENTRY_RAW(exc_nmi) > > > */ > > > sev_es_ist_enter(regs); > > > - this_cpu_write(nmi_dr7, local_db_save()); > > > + this_cpu_write(nmi_dr7, local_db_save_exc_nmi()); > > > irq_state = irqentry_nmi_enter(regs); > > > > So what I don't get is why sev_es_ist_enter() doesn't cause us to make a > > stack frame, that has an actual call in it (although admittedly > > conditional). > > Is not the frame gone when sev_es_ist_enter() (which does not get inlined as > per objdump's "ffffffff81bd4550 <__sev_es_ist_enter>: > ") returned? Well, returning would consume the callframe, but the stack setup of the caller should remain. Let me go stare at some asm.