static int kvmppc_handle_nested_exit(struct kvm_vcpu *vcpu)
 {
+       struct kvm_nested_guest *nested = vcpu->arch.nested;
        int r;
        int srcu_idx;
 
                fallthrough; /* go to facility unavailable handler */
 #endif
 
-       case BOOK3S_INTERRUPT_H_FAC_UNAVAIL:
-               r = RESUME_HOST;
+       case BOOK3S_INTERRUPT_H_FAC_UNAVAIL: {
+               u64 cause = vcpu->arch.hfscr >> 56;
+
+               /*
+                * Only pass HFU interrupts to the L1 if the facility is
+                * permitted but disabled by the L1's HFSCR, otherwise
+                * the interrupt does not make sense to the L1 so turn
+                * it into a HEAI.
+                */
+               if (!(vcpu->arch.hfscr_permitted & (1UL << cause)) ||
+                                       (nested->hfscr & (1UL << cause))) {
+                       vcpu->arch.trap = BOOK3S_INTERRUPT_H_EMUL_ASSIST;
+
+                       /*
+                        * If the fetch failed, return to guest and
+                        * try executing it again.
+                        */
+                       r = kvmppc_get_last_inst(vcpu, INST_GENERIC,
+                                                &vcpu->arch.emul_inst);
+                       if (r != EMULATE_DONE)
+                               r = RESUME_GUEST;
+                       else
+                               r = RESUME_HOST;
+               } else {
+                       r = RESUME_HOST;
+               }
+
                break;
+       }
 
        case BOOK3S_INTERRUPT_HV_RM_HARD:
                vcpu->arch.trap = 0;