x86/sev: Propagate #GP if getting linear instruction address failed
When an instruction is fetched from user-space, segmentation needs to be taken into account. This means that getting the linear address of an instruction can fail. Hardware would raise a #GP exception in that case, but the #VC exception handler would emulate it as a page-fault. The insn_fetch_from_user*() functions now provide the relevant information in case of a failure. Use that and propagate a #GP when the linear address of an instruction to fetch could not be calculated. Signed-off-by: Joerg Roedel <jroedel@suse.de> Signed-off-by: Borislav Petkov <bp@suse.de> Link: https://lkml.kernel.org/r/20210614135327.9921-7-joro@8bytes.org
This commit is contained in:
parent
4aaa7eacd7
commit
07570cef5e
@ -261,11 +261,18 @@ static enum es_result __vc_decode_user_insn(struct es_em_ctxt *ctxt)
|
||||
int insn_bytes;
|
||||
|
||||
insn_bytes = insn_fetch_from_user_inatomic(ctxt->regs, buffer);
|
||||
if (insn_bytes <= 0) {
|
||||
if (insn_bytes == 0) {
|
||||
/* Nothing could be copied */
|
||||
ctxt->fi.vector = X86_TRAP_PF;
|
||||
ctxt->fi.error_code = X86_PF_INSTR | X86_PF_USER;
|
||||
ctxt->fi.cr2 = ctxt->regs->ip;
|
||||
return ES_EXCEPTION;
|
||||
} else if (insn_bytes == -EINVAL) {
|
||||
/* Effective RIP could not be calculated */
|
||||
ctxt->fi.vector = X86_TRAP_GP;
|
||||
ctxt->fi.error_code = 0;
|
||||
ctxt->fi.cr2 = 0;
|
||||
return ES_EXCEPTION;
|
||||
}
|
||||
|
||||
if (!insn_decode_from_regs(&ctxt->insn, ctxt->regs, buffer, insn_bytes))
|
||||
|
Loading…
Reference in New Issue
Block a user