diff mbox

[2/7] Added ONE_REG interface for debug instruction

Message ID 1362024796-4237-3-git-send-email-bharat.bhushan@freescale.com (mailing list archive)
State New, archived
Headers show

Commit Message

Bharat Bhushan Feb. 28, 2013, 4:13 a.m. UTC
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>
---
 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(-)

Comments

Scott Wood Feb. 28, 2013, 4:23 p.m. UTC | #1
On 02/27/2013 10:13:11 PM, Bharat Bhushan wrote:
> 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;
> +	}

We're using ehpriv even for PR-mode KVM (e.g. e500v2)?

-Scott
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexander Graf Feb. 28, 2013, 4:52 p.m. UTC | #2
On 28.02.2013, at 17:23, Scott Wood wrote:

> On 02/27/2013 10:13:11 PM, Bharat Bhushan wrote:
>> 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;
>> +	}
> 
> We're using ehpriv even for PR-mode KVM (e.g. e500v2)?

If it's a reserved instruction, that should work. Since we need to use a single instruction to replace the debugged one with, any reserved opcode should be as good as any other, right?


Alex

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bharat Bhushan March 1, 2013, 5:28 a.m. UTC | #3
> -----Original Message-----
> From: kvm-ppc-owner@vger.kernel.org [mailto:kvm-ppc-
> owner@vger.kernel.org] On Behalf Of Alexander Graf
> Sent: Thursday, February 28, 2013 10:22 PM
> To: Wood Scott-B07421
> Cc: Bhushan Bharat-R65777; kvm-ppc@vger.kernel.org; kvm@vger.kernel.org;
> Bhushan Bharat-R65777
> Subject: Re: [PATCH 2/7] Added ONE_REG interface for debug instruction
> 
> 
> On 28.02.2013, at 17:23, Scott Wood wrote:
> 
> > On 02/27/2013 10:13:11 PM, Bharat Bhushan wrote:
> >> 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;
> >> +	}
> >
> > We're using ehpriv even for PR-mode KVM (e.g. e500v2)?
> 
> If it's a reserved instruction, that should work. Since we need to use a
> single instruction to replace the debugged one with, any reserved opcode
> should be as good as any other, right?

Right, that has been the idea here.

Thanks
-Bharat

> 
> 
> Alex
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the
> body of a message to majordomo@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 majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexander Graf March 7, 2013, 1:07 p.m. UTC | #4
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.bhushan@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 majordomo@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 majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bharat Bhushan March 14, 2013, 4:30 a.m. UTC | #5
> -----Original Message-----
> From: Alexander Graf [mailto:agraf@suse.de]
> Sent: Thursday, March 07, 2013 6:38 PM
> To: Bhushan Bharat-R65777
> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org; Wood Scott-B07421; Bhushan
> Bharat-R65777
> Subject: Re: [PATCH 2/7] Added ONE_REG interface for debug instruction
> 
> 
> 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.bhushan@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.

Yes I missed this.
BTW rather than setting TO = 31, what if we set TO = 2 as RA and RB is same here.

-Bharat

> 
> 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 majordomo@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 majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexander Graf March 14, 2013, 11:56 a.m. UTC | #6
On 14.03.2013, at 05:30, Bhushan Bharat-R65777 wrote:

> 
> 
>> -----Original Message-----
>> From: Alexander Graf [mailto:agraf@suse.de]
>> Sent: Thursday, March 07, 2013 6:38 PM
>> To: Bhushan Bharat-R65777
>> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org; Wood Scott-B07421; Bhushan
>> Bharat-R65777
>> Subject: Re: [PATCH 2/7] Added ONE_REG interface for debug instruction
>> 
>> 
>> 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.bhushan@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.
> 
> Yes I missed this.
> BTW rather than setting TO = 31, what if we set TO = 2 as RA and RB is same here.

Well, the unconditional "trap" instruction is simply defined as TO = 31, so I'd stick to that :)


Alex

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

Patch

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
 
 /* 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;
 	}