Writing to IC is not allowed in the privileged mode.
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
        /* Time base value when we entered the guest */
        u64 entry_tb;
        u64 entry_vtb;
+       u64 entry_ic;
        u32 tcr;
        ulong tsr; /* we need to perform set/clr_bits() which requires ulong */
        u32 ivor[64];
 
                case KVM_REG_PPC_VTB:
                        val = get_reg_val(reg->id, vcpu->arch.vtb);
                        break;
+               case KVM_REG_PPC_IC:
+                       val = get_reg_val(reg->id, vcpu->arch.ic);
+                       break;
                default:
                        r = -EINVAL;
                        break;
                case KVM_REG_PPC_VTB:
                        vcpu->arch.vtb = set_reg_val(reg->id, val);
                        break;
+               case KVM_REG_PPC_IC:
+                       vcpu->arch.ic = set_reg_val(reg->id, val);
+                       break;
                default:
                        r = -EINVAL;
                        break;
 
        case SPRN_VTB:
                *spr_val = vcpu->arch.vtb;
                break;
+       case SPRN_IC:
+               *spr_val = vcpu->arch.ic;
+               break;
        case SPRN_GQR0:
        case SPRN_GQR1:
        case SPRN_GQR2:
 
        case KVM_REG_PPC_CIABR:
                *val = get_reg_val(id, vcpu->arch.ciabr);
                break;
-       case KVM_REG_PPC_IC:
-               *val = get_reg_val(id, vcpu->arch.ic);
-               break;
        case KVM_REG_PPC_CSIGR:
                *val = get_reg_val(id, vcpu->arch.csigr);
                break;
                if ((vcpu->arch.ciabr & CIABR_PRIV) == CIABR_PRIV_HYPER)
                        vcpu->arch.ciabr &= ~CIABR_PRIV;        /* disable */
                break;
-       case KVM_REG_PPC_IC:
-               vcpu->arch.ic = set_reg_val(id, *val);
-               break;
        case KVM_REG_PPC_CSIGR:
                vcpu->arch.csigr = set_reg_val(id, *val);
                break;
 
         */
        vcpu->arch.entry_tb = get_tb();
        vcpu->arch.entry_vtb = get_vtb();
+       if (cpu_has_feature(CPU_FTR_ARCH_207S))
+               vcpu->arch.entry_ic = mfspr(SPRN_IC);
        svcpu->in_use = true;
 }
 
        vcpu->arch.purr += get_tb() - vcpu->arch.entry_tb;
        vcpu->arch.spurr += get_tb() - vcpu->arch.entry_tb;
        vcpu->arch.vtb += get_vtb() - vcpu->arch.entry_vtb;
+       if (cpu_has_feature(CPU_FTR_ARCH_207S))
+               vcpu->arch.ic += mfspr(SPRN_IC) - vcpu->arch.entry_ic;
        svcpu->in_use = false;
 
 out: