return vbar + 0x480;
  }
  
 +static void __kprobes notrace __sdei_pstate_entry(void)
 +{
 +      /*
 +       * The original SDEI spec (ARM DEN 0054A) can be read ambiguously as to
 +       * whether PSTATE bits are inherited unchanged or generated from
 +       * scratch, and the TF-A implementation always clears PAN and always
 +       * clears UAO. There are no other known implementations.
 +       *
 +       * Subsequent revisions (ARM DEN 0054B) follow the usual rules for how
 +       * PSTATE is modified upon architectural exceptions, and so PAN is
 +       * either inherited or set per SCTLR_ELx.SPAN, and UAO is always
 +       * cleared.
 +       *
 +       * We must explicitly reset PAN to the expected state, including
 +       * clearing it when the host isn't using it, in case a VM had it set.
 +       */
 +      if (system_uses_hw_pan())
 +              set_pstate_pan(1);
 +      else if (cpu_has_pan())
 +              set_pstate_pan(0);
 +}
  
- asmlinkage __kprobes notrace unsigned long
+ asmlinkage noinstr unsigned long
  __sdei_handler(struct pt_regs *regs, struct sdei_registered_event *arg)
  {
        unsigned long ret;
  
-       nmi_enter();
 +      /*
 +       * We didn't take an exception to get here, so the HW hasn't
 +       * set/cleared bits in PSTATE that we may rely on. Initialize PAN.
 +       */
 +      __sdei_pstate_entry();
 +
+       arm64_enter_nmi(regs);
  
        ret = _sdei_handler(regs, arg);
  
 
                svm->avic_is_running = true;
  
        svm->msrpm = svm_vcpu_alloc_msrpm();
-       if (!svm->msrpm)
+       if (!svm->msrpm) {
+               err = -ENOMEM;
 -              goto error_free_vmcb_page;
 +              goto error_free_vmsa_page;
+       }
  
        svm_vcpu_init_msrpm(vcpu, svm->msrpm);