gpio: tegra186: Don't set parent IRQ affinity
[linux-2.6-microblaze.git] / arch / x86 / kernel / sev-es.c
index 26f5479..73873b0 100644 (file)
@@ -263,39 +263,54 @@ static int vc_fetch_insn_kernel(struct es_em_ctxt *ctxt,
        return copy_from_kernel_nofault(buffer, (unsigned char *)ctxt->regs->ip, MAX_INSN_SIZE);
 }
 
-static enum es_result vc_decode_insn(struct es_em_ctxt *ctxt)
+static enum es_result __vc_decode_user_insn(struct es_em_ctxt *ctxt)
 {
        char buffer[MAX_INSN_SIZE];
-       enum es_result ret;
        int res;
 
-       if (user_mode(ctxt->regs)) {
-               res = insn_fetch_from_user_inatomic(ctxt->regs, buffer);
-               if (!res) {
-                       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;
-               }
+       res = insn_fetch_from_user_inatomic(ctxt->regs, buffer);
+       if (!res) {
+               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;
+       }
 
-               if (!insn_decode(&ctxt->insn, ctxt->regs, buffer, res))
-                       return ES_DECODE_FAILED;
-       } else {
-               res = vc_fetch_insn_kernel(ctxt, buffer);
-               if (res) {
-                       ctxt->fi.vector     = X86_TRAP_PF;
-                       ctxt->fi.error_code = X86_PF_INSTR;
-                       ctxt->fi.cr2        = ctxt->regs->ip;
-                       return ES_EXCEPTION;
-               }
+       if (!insn_decode_from_regs(&ctxt->insn, ctxt->regs, buffer, res))
+               return ES_DECODE_FAILED;
+
+       if (ctxt->insn.immediate.got)
+               return ES_OK;
+       else
+               return ES_DECODE_FAILED;
+}
 
-               insn_init(&ctxt->insn, buffer, MAX_INSN_SIZE, 1);
-               insn_get_length(&ctxt->insn);
+static enum es_result __vc_decode_kern_insn(struct es_em_ctxt *ctxt)
+{
+       char buffer[MAX_INSN_SIZE];
+       int res, ret;
+
+       res = vc_fetch_insn_kernel(ctxt, buffer);
+       if (res) {
+               ctxt->fi.vector     = X86_TRAP_PF;
+               ctxt->fi.error_code = X86_PF_INSTR;
+               ctxt->fi.cr2        = ctxt->regs->ip;
+               return ES_EXCEPTION;
        }
 
-       ret = ctxt->insn.immediate.got ? ES_OK : ES_DECODE_FAILED;
+       ret = insn_decode(&ctxt->insn, buffer, MAX_INSN_SIZE, INSN_MODE_64);
+       if (ret < 0)
+               return ES_DECODE_FAILED;
+       else
+               return ES_OK;
+}
 
-       return ret;
+static enum es_result vc_decode_insn(struct es_em_ctxt *ctxt)
+{
+       if (user_mode(ctxt->regs))
+               return __vc_decode_user_insn(ctxt);
+       else
+               return __vc_decode_kern_insn(ctxt);
 }
 
 static enum es_result vc_write_mem(struct es_em_ctxt *ctxt,