diff options
| -rw-r--r-- | arch/x86/kernel/sev-es.c | 17 | 
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/x86/kernel/sev-es.c b/arch/x86/kernel/sev-es.c index 8867c481e3e2..79d5190cbc6b 100644 --- a/arch/x86/kernel/sev-es.c +++ b/arch/x86/kernel/sev-es.c @@ -922,6 +922,14 @@ static enum es_result vc_handle_trap_ac(struct ghcb *ghcb,  	return ES_EXCEPTION;  } +static __always_inline void vc_handle_trap_db(struct pt_regs *regs) +{ +	if (user_mode(regs)) +		noist_exc_debug(regs); +	else +		exc_debug(regs); +} +  static enum es_result vc_handle_exitcode(struct es_em_ctxt *ctxt,  					 struct ghcb *ghcb,  					 unsigned long exit_code) @@ -1033,6 +1041,15 @@ DEFINE_IDTENTRY_VC_SAFE_STACK(exc_vmm_communication)  	struct ghcb *ghcb;  	lockdep_assert_irqs_disabled(); + +	/* +	 * Handle #DB before calling into !noinstr code to avoid recursive #DB. +	 */ +	if (error_code == SVM_EXIT_EXCP_BASE + X86_TRAP_DB) { +		vc_handle_trap_db(regs); +		return; +	} +  	instrumentation_begin();  	/*  | 
