Added ONE_REG interface for debug instruction
authorBharat Bhushan <r65777@freescale.com>
Wed, 20 Mar 2013 20:24:58 +0000 (20:24 +0000)
committerAlexander Graf <agraf@suse.de>
Wed, 17 Apr 2013 13:21:14 +0000 (15:21 +0200)
This patch adds the one_reg interface to get the special instruction
to be used for setting software breakpoint from userspace.

Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
arch/powerpc/include/asm/kvm_book3s.h
arch/powerpc/include/asm/kvm_booke.h
arch/powerpc/include/uapi/asm/kvm.h
arch/powerpc/kvm/book3s.c
arch/powerpc/kvm/booke.c

index 5a56e1c5f8517fde0b4005c0c456d14a0b4ce7bc..bc81842ea25a3efd4a3637efc4ed1b824d562489 100644 (file)
@@ -458,6 +458,8 @@ static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu)
 #define OSI_SC_MAGIC_R4                        0x77810F9B
 
 #define INS_DCBZ                       0x7c0007ec
+/* TO = 31 for unconditional trap */
+#define INS_TW                         0x7fe00008
 
 /* LPIDs we support with this build -- runtime limit may be lower */
 #define KVMPPC_NR_LPIDS                        (LPID_RSVD + 1)
index b7cd3356a532d7c76d53dd9e1c418c40adb35275..d3c1eb34c986470af2f7f4baa0bfc226b1ca1488 100644 (file)
@@ -26,6 +26,8 @@
 /* LPIDs we support with this build -- runtime limit may be lower */
 #define KVMPPC_NR_LPIDS                        64
 
+#define KVMPPC_INST_EHPRIV     0x7c00021c
+
 static inline void kvmppc_set_gpr(struct kvm_vcpu *vcpu, int num, ulong val)
 {
        vcpu->arch.gpr[num] = val;
index ef072b1a6e3f0dd7dd0e1c0637e9257b9324dc2a..c2ff99c0156263899c9ad111414b23c349f8957d 100644 (file)
@@ -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_TCR                (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x89)
 #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 */
index 6548445fd823a1453ae09b111b0d9d9416a72c7e..2d32ae4bc4390e7ab2224bf4d8fdab38c7883230 100644 (file)
@@ -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]);
                        break;
 #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:
                        r = -EINVAL;
                        break;
index 58057d6f146d82328e596bf6b540cef5de6e29f6..a49a68a25c392b26ca541ed7d45631ed8d206dba 100644 (file)
@@ -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:
                r = put_user(vcpu->arch.tsr, (u32 __user *)(long)reg->addr);
                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:
                break;
        }