Merge git://github.com/agraf/linux-2.6.git kvm-ppc-next into queue
This commit is contained in:
commit
d10ab869ae
7 changed files with 22 additions and 1 deletions
|
@ -458,6 +458,8 @@ static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu)
|
||||||
#define OSI_SC_MAGIC_R4 0x77810F9B
|
#define OSI_SC_MAGIC_R4 0x77810F9B
|
||||||
|
|
||||||
#define INS_DCBZ 0x7c0007ec
|
#define INS_DCBZ 0x7c0007ec
|
||||||
|
/* TO = 31 for unconditional trap */
|
||||||
|
#define INS_TW 0x7fe00008
|
||||||
|
|
||||||
/* LPIDs we support with this build -- runtime limit may be lower */
|
/* LPIDs we support with this build -- runtime limit may be lower */
|
||||||
#define KVMPPC_NR_LPIDS (LPID_RSVD + 1)
|
#define KVMPPC_NR_LPIDS (LPID_RSVD + 1)
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
/* LPIDs we support with this build -- runtime limit may be lower */
|
/* LPIDs we support with this build -- runtime limit may be lower */
|
||||||
#define KVMPPC_NR_LPIDS 64
|
#define KVMPPC_NR_LPIDS 64
|
||||||
|
|
||||||
|
#define KVMPPC_INST_EHPRIV 0x7c00021c
|
||||||
|
|
||||||
static inline void kvmppc_set_gpr(struct kvm_vcpu *vcpu, int num, ulong val)
|
static inline void kvmppc_set_gpr(struct kvm_vcpu *vcpu, int num, ulong val)
|
||||||
{
|
{
|
||||||
vcpu->arch.gpr[num] = val;
|
vcpu->arch.gpr[num] = val;
|
||||||
|
|
|
@ -422,4 +422,8 @@ struct kvm_get_htab_header {
|
||||||
#define KVM_REG_PPC_CLEAR_TSR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x88)
|
#define KVM_REG_PPC_CLEAR_TSR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x88)
|
||||||
#define KVM_REG_PPC_TCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x89)
|
#define KVM_REG_PPC_TCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x89)
|
||||||
#define KVM_REG_PPC_TSR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8a)
|
#define KVM_REG_PPC_TSR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8a)
|
||||||
|
|
||||||
|
/* Debugging: Special instruction for software breakpoint */
|
||||||
|
#define KVM_REG_PPC_DEBUG_INST (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8b)
|
||||||
|
|
||||||
#endif /* __LINUX_KVM_POWERPC_H */
|
#endif /* __LINUX_KVM_POWERPC_H */
|
||||||
|
|
|
@ -529,6 +529,12 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
|
||||||
val = get_reg_val(reg->id, vcpu->arch.vscr.u[3]);
|
val = get_reg_val(reg->id, vcpu->arch.vscr.u[3]);
|
||||||
break;
|
break;
|
||||||
#endif /* CONFIG_ALTIVEC */
|
#endif /* CONFIG_ALTIVEC */
|
||||||
|
case KVM_REG_PPC_DEBUG_INST: {
|
||||||
|
u32 opcode = INS_TW;
|
||||||
|
r = copy_to_user((u32 __user *)(long)reg->addr,
|
||||||
|
&opcode, sizeof(u32));
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
r = -EINVAL;
|
r = -EINVAL;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1447,6 +1447,12 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
|
||||||
case KVM_REG_PPC_TSR:
|
case KVM_REG_PPC_TSR:
|
||||||
r = put_user(vcpu->arch.tsr, (u32 __user *)(long)reg->addr);
|
r = put_user(vcpu->arch.tsr, (u32 __user *)(long)reg->addr);
|
||||||
break;
|
break;
|
||||||
|
case KVM_REG_PPC_DEBUG_INST: {
|
||||||
|
u32 opcode = KVMPPC_INST_EHPRIV;
|
||||||
|
r = copy_to_user((u32 __user *)(long)reg->addr,
|
||||||
|
&opcode, sizeof(u32));
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
|
|
||||||
#define OP_31_XOP_TRAP 4
|
#define OP_31_XOP_TRAP 4
|
||||||
#define OP_31_XOP_LWZX 23
|
#define OP_31_XOP_LWZX 23
|
||||||
|
#define OP_31_XOP_DCBST 54
|
||||||
#define OP_31_XOP_TRAP_64 68
|
#define OP_31_XOP_TRAP_64 68
|
||||||
#define OP_31_XOP_DCBF 86
|
#define OP_31_XOP_DCBF 86
|
||||||
#define OP_31_XOP_LBZX 87
|
#define OP_31_XOP_LBZX 87
|
||||||
|
@ -370,6 +371,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
||||||
emulated = kvmppc_emulate_mtspr(vcpu, sprn, rs);
|
emulated = kvmppc_emulate_mtspr(vcpu, sprn, rs);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OP_31_XOP_DCBST:
|
||||||
case OP_31_XOP_DCBF:
|
case OP_31_XOP_DCBF:
|
||||||
case OP_31_XOP_DCBI:
|
case OP_31_XOP_DCBI:
|
||||||
/* Do nothing. The guest is performing dcbi because
|
/* Do nothing. The guest is performing dcbi because
|
||||||
|
|
|
@ -683,7 +683,6 @@ int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
||||||
|
|
||||||
if (!kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, run->mmio.phys_addr,
|
if (!kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, run->mmio.phys_addr,
|
||||||
bytes, &run->mmio.data)) {
|
bytes, &run->mmio.data)) {
|
||||||
kvmppc_complete_mmio_load(vcpu, run);
|
|
||||||
vcpu->mmio_needed = 0;
|
vcpu->mmio_needed = 0;
|
||||||
return EMULATE_DONE;
|
return EMULATE_DONE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue