On 28.02.2013, at 05:13, Bharat Bhushan wrote:

> 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.bhus...@freescale.com>
> ---
> Documentation/virtual/kvm/api.txt     |    1 +
> arch/powerpc/include/asm/kvm_book3s.h |    1 +
> arch/powerpc/include/asm/kvm_booke.h  |    2 ++
> arch/powerpc/include/uapi/asm/kvm.h   |    4 ++++
> arch/powerpc/kvm/book3s.c             |    6 ++++++
> arch/powerpc/kvm/booke.c              |    6 ++++++
> 6 files changed, 20 insertions(+), 0 deletions(-)
> 
> diff --git a/Documentation/virtual/kvm/api.txt 
> b/Documentation/virtual/kvm/api.txt
> index cce500a..dbfcc04 100644
> --- a/Documentation/virtual/kvm/api.txt
> +++ b/Documentation/virtual/kvm/api.txt
> @@ -1766,6 +1766,7 @@ registers, find a list below:
>   PPC   | KVM_REG_PPC_TSR     | 32
>   PPC   | KVM_REG_PPC_OR_TSR  | 32
>   PPC   | KVM_REG_PPC_CLEAR_TSR       | 32
> +  PPC   | KVM_REG_PPC_DEBUG_INST| 32
> 
> 4.69 KVM_GET_ONE_REG
> 
> diff --git a/arch/powerpc/include/asm/kvm_book3s.h 
> b/arch/powerpc/include/asm/kvm_book3s.h
> index 5a56e1c..36164cc 100644
> --- a/arch/powerpc/include/asm/kvm_book3s.h
> +++ b/arch/powerpc/include/asm/kvm_book3s.h
> @@ -458,6 +458,7 @@ static inline bool kvmppc_critical_section(struct 
> kvm_vcpu *vcpu)
> #define OSI_SC_MAGIC_R4                       0x77810F9B
> 
> #define INS_DCBZ                      0x7c0007ec
> +#define INS_TW                               0x7c000008

This one should be "trap", so TO needs to be 31. The instruction as it's here 
is a nop if I read the spec correctly.

Alex

> 
> /* LPIDs we support with this build -- runtime limit may be lower */
> #define KVMPPC_NR_LPIDS                       (LPID_RSVD + 1)
> diff --git a/arch/powerpc/include/asm/kvm_booke.h 
> b/arch/powerpc/include/asm/kvm_booke.h
> index b7cd335..d3c1eb3 100644
> --- a/arch/powerpc/include/asm/kvm_booke.h
> +++ b/arch/powerpc/include/asm/kvm_booke.h
> @@ -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;
> diff --git a/arch/powerpc/include/uapi/asm/kvm.h 
> b/arch/powerpc/include/uapi/asm/kvm.h
> index ef072b1..c2ff99c 100644
> --- a/arch/powerpc/include/uapi/asm/kvm.h
> +++ b/arch/powerpc/include/uapi/asm/kvm.h
> @@ -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 */
> diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
> index a4b6452..975a401 100644
> --- a/arch/powerpc/kvm/book3s.c
> +++ b/arch/powerpc/kvm/book3s.c
> @@ -530,6 +530,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;
> diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
> index 8b553c0..a41cd6d 100644
> --- a/arch/powerpc/kvm/booke.c
> +++ b/arch/powerpc/kvm/booke.c
> @@ -1448,6 +1448,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;
>       }
> -- 
> 1.7.0.4
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to