int kvmppc_e500_emul_tlbwe(struct kvm_vcpu *vcpu);
 int kvmppc_e500_emul_tlbre(struct kvm_vcpu *vcpu);
 int kvmppc_e500_emul_tlbivax(struct kvm_vcpu *vcpu, int ra, int rb);
+int kvmppc_e500_emul_tlbilx(struct kvm_vcpu *vcpu, int rt, int ra, int rb);
 int kvmppc_e500_emul_tlbsx(struct kvm_vcpu *vcpu, int rb);
 int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500);
 void kvmppc_e500_tlb_uninit(struct kvmppc_vcpu_e500 *vcpu_e500);
 
 #define XOP_TLBSX   914
 #define XOP_TLBRE   946
 #define XOP_TLBWE   978
+#define XOP_TLBILX  18
 
 int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
                            unsigned int inst, int *advance)
        int emulated = EMULATE_DONE;
        int ra;
        int rb;
+       int rt;
 
        switch (get_op(inst)) {
        case 31:
                        emulated = kvmppc_e500_emul_tlbsx(vcpu,rb);
                        break;
 
+               case XOP_TLBILX:
+                       ra = get_ra(inst);
+                       rb = get_rb(inst);
+                       rt = get_rt(inst);
+                       emulated = kvmppc_e500_emul_tlbilx(vcpu, rt, ra, rb);
+                       break;
+
                case XOP_TLBIVAX:
                        ra = get_ra(inst);
                        rb = get_rb(inst);
 
        return EMULATE_DONE;
 }
 
+static void tlbilx_all(struct kvmppc_vcpu_e500 *vcpu_e500, int tlbsel,
+                      int pid, int rt)
+{
+       struct kvm_book3e_206_tlb_entry *tlbe;
+       int tid, esel;
+
+       /* invalidate all entries */
+       for (esel = 0; esel < vcpu_e500->gtlb_params[tlbsel].entries; esel++) {
+               tlbe = get_entry(vcpu_e500, tlbsel, esel);
+               tid = get_tlb_tid(tlbe);
+               if (rt == 0 || tid == pid) {
+                       inval_gtlbe_on_host(vcpu_e500, tlbsel, esel);
+                       kvmppc_e500_gtlbe_invalidate(vcpu_e500, tlbsel, esel);
+               }
+       }
+}
+
+static void tlbilx_one(struct kvmppc_vcpu_e500 *vcpu_e500, int pid,
+                      int ra, int rb)
+{
+       int tlbsel, esel;
+       gva_t ea;
+
+       ea = kvmppc_get_gpr(&vcpu_e500->vcpu, rb);
+       if (ra)
+               ea += kvmppc_get_gpr(&vcpu_e500->vcpu, ra);
+
+       for (tlbsel = 0; tlbsel < 2; tlbsel++) {
+               esel = kvmppc_e500_tlb_index(vcpu_e500, ea, tlbsel, pid, -1);
+               if (esel >= 0) {
+                       inval_gtlbe_on_host(vcpu_e500, tlbsel, esel);
+                       kvmppc_e500_gtlbe_invalidate(vcpu_e500, tlbsel, esel);
+                       break;
+               }
+       }
+}
+
+int kvmppc_e500_emul_tlbilx(struct kvm_vcpu *vcpu, int rt, int ra, int rb)
+{
+       struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
+       int pid = get_cur_spid(vcpu);
+
+       if (rt == 0 || rt == 1) {
+               tlbilx_all(vcpu_e500, 0, pid, rt);
+               tlbilx_all(vcpu_e500, 1, pid, rt);
+       } else if (rt == 3) {
+               tlbilx_one(vcpu_e500, pid, ra, rb);
+       }
+
+       return EMULATE_DONE;
+}
+
 int kvmppc_e500_emul_tlbre(struct kvm_vcpu *vcpu)
 {
        struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);