#define H_GET_24X7_DATA                0xF07C
 #define H_GET_PERF_COUNTER_INFO        0xF080
 
+/* Values for 2nd argument to H_SET_MODE */
+#define H_SET_MODE_RESOURCE_SET_CIABR          1
+#define H_SET_MODE_RESOURCE_SET_DAWR           2
+#define H_SET_MODE_RESOURCE_ADDR_TRANS_MODE    3
+#define H_SET_MODE_RESOURCE_LE                 4
+
 #ifndef __ASSEMBLY__
 
 /**
 
        vcpu->arch.dtl.dirty = true;
 }
 
+static bool kvmppc_power8_compatible(struct kvm_vcpu *vcpu)
+{
+       if (vcpu->arch.vcore->arch_compat >= PVR_ARCH_207)
+               return true;
+       if ((!vcpu->arch.vcore->arch_compat) &&
+           cpu_has_feature(CPU_FTR_ARCH_207S))
+               return true;
+       return false;
+}
+
+static int kvmppc_h_set_mode(struct kvm_vcpu *vcpu, unsigned long mflags,
+                            unsigned long resource, unsigned long value1,
+                            unsigned long value2)
+{
+       switch (resource) {
+       case H_SET_MODE_RESOURCE_SET_CIABR:
+               if (!kvmppc_power8_compatible(vcpu))
+                       return H_P2;
+               if (value2)
+                       return H_P4;
+               if (mflags)
+                       return H_UNSUPPORTED_FLAG_START;
+               /* Guests can't breakpoint the hypervisor */
+               if ((value1 & CIABR_PRIV) == CIABR_PRIV_HYPER)
+                       return H_P3;
+               vcpu->arch.ciabr  = value1;
+               return H_SUCCESS;
+       case H_SET_MODE_RESOURCE_SET_DAWR:
+               if (!kvmppc_power8_compatible(vcpu))
+                       return H_P2;
+               if (mflags)
+                       return H_UNSUPPORTED_FLAG_START;
+               if (value2 & DABRX_HYP)
+                       return H_P4;
+               vcpu->arch.dawr  = value1;
+               vcpu->arch.dawrx = value2;
+               return H_SUCCESS;
+       default:
+               return H_TOO_HARD;
+       }
+}
+
 int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
 {
        unsigned long req = kvmppc_get_gpr(vcpu, 3);
 
                /* Send the error out to userspace via KVM_RUN */
                return rc;
-
+       case H_SET_MODE:
+               ret = kvmppc_h_set_mode(vcpu, kvmppc_get_gpr(vcpu, 4),
+                                       kvmppc_get_gpr(vcpu, 5),
+                                       kvmppc_get_gpr(vcpu, 6),
+                                       kvmppc_get_gpr(vcpu, 7));
+               if (ret == H_TOO_HARD)
+                       return RESUME_HOST;
+               break;
        case H_XIRR:
        case H_CPPR:
        case H_EOI:
        case H_PROD:
        case H_CONFER:
        case H_REGISTER_VPA:
+       case H_SET_MODE:
 #ifdef CONFIG_KVM_XICS
        case H_XIRR:
        case H_CPPR: