case BOOKE_INTERRUPT_PROGRAM:
                if (vcpu->arch.shared->msr & (MSR_PR | MSR_GS)) {
-                       /* Program traps generated by user-level software must be handled
-                        * by the guest kernel. */
+                       /*
+                        * Program traps generated by user-level software must
+                        * be handled by the guest kernel.
+                        *
+                        * In GS mode, hypervisor privileged instructions trap
+                        * on BOOKE_INTERRUPT_HV_PRIV, not here, so these are
+                        * actual program interrupts, handled by the guest.
+                        */
                        kvmppc_core_queue_program(vcpu, vcpu->arch.fault_esr);
                        r = RESUME_GUEST;
                        kvmppc_account_exit(vcpu, USR_PR_INST);