Patchwork [v11,8/8] PPC: Don't use hardcoded opcode for ePAPR hcall invocation

login
register
mail settings
Submitter Stuart Yoder
Date June 22, 2012, 8:06 p.m.
Message ID <1340395568-29620-1-git-send-email-stuart.yoder@freescale.com>
Download mbox | patch
Permalink /patch/166674/
State New
Headers show

Comments

Stuart Yoder - June 22, 2012, 8:06 p.m.
From: Liu Yu-B13201 <Yu.Liu@freescale.com>

Signed-off-by: Liu Yu <yu.liu@freescale.com>
Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
---
-v11: no changes

 arch/powerpc/include/asm/epapr_hcalls.h |   22 +++++++++---------
 arch/powerpc/include/asm/fsl_hcalls.h   |   36 +++++++++++++++---------------
 2 files changed, 29 insertions(+), 29 deletions(-)
Alexander Graf - July 2, 2012, 12:30 p.m.
On 22.06.2012, at 22:06, Stuart Yoder wrote:

> From: Liu Yu-B13201 <Yu.Liu@freescale.com>
> 
> Signed-off-by: Liu Yu <yu.liu@freescale.com>
> Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
> ---
> -v11: no changes
> 
> arch/powerpc/include/asm/epapr_hcalls.h |   22 +++++++++---------
> arch/powerpc/include/asm/fsl_hcalls.h   |   36 +++++++++++++++---------------
> 2 files changed, 29 insertions(+), 29 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
> index 833ce2c..b8d9445 100644
> --- a/arch/powerpc/include/asm/epapr_hcalls.h
> +++ b/arch/powerpc/include/asm/epapr_hcalls.h
> @@ -195,7 +195,7 @@ static inline unsigned int ev_int_set_config(unsigned int interrupt,
> 	r5  = priority;
> 	r6  = destination;
> 
> -	__asm__ __volatile__ ("sc 1"
> +	asm volatile("bl	epapr_hypercall_start"
> 		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
> 		: : EV_HCALL_CLOBBERS4

Hrm. ePAPR hypercalls are allowed to clobber lr, right? But our hypercall entry code depends on lr staying alive:

.global epapr_hypercall_start
epapr_hypercall_start:
        li      r3, -1
        nop
        nop
        nop
        blr

So I suppose for this to work, we'd have to store lr off to the stack before doing the hypercall in epapr_hypercall_start.


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
Scott Wood - July 2, 2012, 5:10 p.m.
On 07/02/2012 07:30 AM, Alexander Graf wrote:
> 
> On 22.06.2012, at 22:06, Stuart Yoder wrote:
> 
>> From: Liu Yu-B13201 <Yu.Liu@freescale.com>
>>
>> Signed-off-by: Liu Yu <yu.liu@freescale.com>
>> Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
>> ---
>> -v11: no changes
>>
>> arch/powerpc/include/asm/epapr_hcalls.h |   22 +++++++++---------
>> arch/powerpc/include/asm/fsl_hcalls.h   |   36 +++++++++++++++---------------
>> 2 files changed, 29 insertions(+), 29 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
>> index 833ce2c..b8d9445 100644
>> --- a/arch/powerpc/include/asm/epapr_hcalls.h
>> +++ b/arch/powerpc/include/asm/epapr_hcalls.h
>> @@ -195,7 +195,7 @@ static inline unsigned int ev_int_set_config(unsigned int interrupt,
>> 	r5  = priority;
>> 	r6  = destination;
>>
>> -	__asm__ __volatile__ ("sc 1"
>> +	asm volatile("bl	epapr_hypercall_start"
>> 		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
>> 		: : EV_HCALL_CLOBBERS4
> 
> Hrm. ePAPR hypercalls are allowed to clobber lr, right? But our hypercall entry code depends on lr staying alive:

ePAPR 1.1 says LR is nonvolatile.

-Scott

--
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
Alexander Graf - July 2, 2012, 5:13 p.m.
On 02.07.2012, at 19:10, Scott Wood wrote:

> On 07/02/2012 07:30 AM, Alexander Graf wrote:
>> 
>> On 22.06.2012, at 22:06, Stuart Yoder wrote:
>> 
>>> From: Liu Yu-B13201 <Yu.Liu@freescale.com>
>>> 
>>> Signed-off-by: Liu Yu <yu.liu@freescale.com>
>>> Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
>>> ---
>>> -v11: no changes
>>> 
>>> arch/powerpc/include/asm/epapr_hcalls.h |   22 +++++++++---------
>>> arch/powerpc/include/asm/fsl_hcalls.h   |   36 +++++++++++++++---------------
>>> 2 files changed, 29 insertions(+), 29 deletions(-)
>>> 
>>> diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
>>> index 833ce2c..b8d9445 100644
>>> --- a/arch/powerpc/include/asm/epapr_hcalls.h
>>> +++ b/arch/powerpc/include/asm/epapr_hcalls.h
>>> @@ -195,7 +195,7 @@ static inline unsigned int ev_int_set_config(unsigned int interrupt,
>>> 	r5  = priority;
>>> 	r6  = destination;
>>> 
>>> -	__asm__ __volatile__ ("sc 1"
>>> +	asm volatile("bl	epapr_hypercall_start"
>>> 		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
>>> 		: : EV_HCALL_CLOBBERS4
>> 
>> Hrm. ePAPR hypercalls are allowed to clobber lr, right? But our hypercall entry code depends on lr staying alive:
> 
> ePAPR 1.1 says LR is nonvolatile.

Why is it in the clobber list then? Not complaining - we need to have it in there for the bl to work out - but still surprised.

arch/powerpc/include/asm/epapr_hcalls.h:#define EV_HCALL_CLOBBERS "r0", "r12", "xer", "ctr", "lr", "cc", "memory"


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
Scott Wood - July 2, 2012, 5:16 p.m.
On 07/02/2012 12:13 PM, Alexander Graf wrote:
> 
> On 02.07.2012, at 19:10, Scott Wood wrote:
> 
>> On 07/02/2012 07:30 AM, Alexander Graf wrote:
>>>
>>> On 22.06.2012, at 22:06, Stuart Yoder wrote:
>>>
>>>> From: Liu Yu-B13201 <Yu.Liu@freescale.com>
>>>>
>>>> Signed-off-by: Liu Yu <yu.liu@freescale.com>
>>>> Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
>>>> ---
>>>> -v11: no changes
>>>>
>>>> arch/powerpc/include/asm/epapr_hcalls.h |   22 +++++++++---------
>>>> arch/powerpc/include/asm/fsl_hcalls.h   |   36 +++++++++++++++---------------
>>>> 2 files changed, 29 insertions(+), 29 deletions(-)
>>>>
>>>> diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
>>>> index 833ce2c..b8d9445 100644
>>>> --- a/arch/powerpc/include/asm/epapr_hcalls.h
>>>> +++ b/arch/powerpc/include/asm/epapr_hcalls.h
>>>> @@ -195,7 +195,7 @@ static inline unsigned int ev_int_set_config(unsigned int interrupt,
>>>> 	r5  = priority;
>>>> 	r6  = destination;
>>>>
>>>> -	__asm__ __volatile__ ("sc 1"
>>>> +	asm volatile("bl	epapr_hypercall_start"
>>>> 		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
>>>> 		: : EV_HCALL_CLOBBERS4
>>>
>>> Hrm. ePAPR hypercalls are allowed to clobber lr, right? But our hypercall entry code depends on lr staying alive:
>>
>> ePAPR 1.1 says LR is nonvolatile.
> 
> Why is it in the clobber list then? 

Because the inline assembly code is clobbering it -- not the hv-provided
hcall instructions.

-Scott

--
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
Alexander Graf - July 2, 2012, 5:17 p.m.
On 02.07.2012, at 19:16, Scott Wood wrote:

> On 07/02/2012 12:13 PM, Alexander Graf wrote:
>> 
>> On 02.07.2012, at 19:10, Scott Wood wrote:
>> 
>>> On 07/02/2012 07:30 AM, Alexander Graf wrote:
>>>> 
>>>> On 22.06.2012, at 22:06, Stuart Yoder wrote:
>>>> 
>>>>> From: Liu Yu-B13201 <Yu.Liu@freescale.com>
>>>>> 
>>>>> Signed-off-by: Liu Yu <yu.liu@freescale.com>
>>>>> Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
>>>>> ---
>>>>> -v11: no changes
>>>>> 
>>>>> arch/powerpc/include/asm/epapr_hcalls.h |   22 +++++++++---------
>>>>> arch/powerpc/include/asm/fsl_hcalls.h   |   36 +++++++++++++++---------------
>>>>> 2 files changed, 29 insertions(+), 29 deletions(-)
>>>>> 
>>>>> diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
>>>>> index 833ce2c..b8d9445 100644
>>>>> --- a/arch/powerpc/include/asm/epapr_hcalls.h
>>>>> +++ b/arch/powerpc/include/asm/epapr_hcalls.h
>>>>> @@ -195,7 +195,7 @@ static inline unsigned int ev_int_set_config(unsigned int interrupt,
>>>>> 	r5  = priority;
>>>>> 	r6  = destination;
>>>>> 
>>>>> -	__asm__ __volatile__ ("sc 1"
>>>>> +	asm volatile("bl	epapr_hypercall_start"
>>>>> 		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
>>>>> 		: : EV_HCALL_CLOBBERS4
>>>> 
>>>> Hrm. ePAPR hypercalls are allowed to clobber lr, right? But our hypercall entry code depends on lr staying alive:
>>> 
>>> ePAPR 1.1 says LR is nonvolatile.
>> 
>> Why is it in the clobber list then? 
> 
> Because the inline assembly code is clobbering it -- not the hv-provided
> hcall instructions.

Only after the change, not before it.


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
Scott Wood - July 2, 2012, 5:25 p.m.
On 07/02/2012 12:17 PM, Alexander Graf wrote:
> 
> On 02.07.2012, at 19:16, Scott Wood wrote:
> 
>> On 07/02/2012 12:13 PM, Alexander Graf wrote:
>>>
>>> On 02.07.2012, at 19:10, Scott Wood wrote:
>>>
>>>> On 07/02/2012 07:30 AM, Alexander Graf wrote:
>>>>>
>>>>> On 22.06.2012, at 22:06, Stuart Yoder wrote:
>>>>>
>>>>>> From: Liu Yu-B13201 <Yu.Liu@freescale.com>
>>>>>>
>>>>>> Signed-off-by: Liu Yu <yu.liu@freescale.com>
>>>>>> Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
>>>>>> ---
>>>>>> -v11: no changes
>>>>>>
>>>>>> arch/powerpc/include/asm/epapr_hcalls.h |   22 +++++++++---------
>>>>>> arch/powerpc/include/asm/fsl_hcalls.h   |   36 +++++++++++++++---------------
>>>>>> 2 files changed, 29 insertions(+), 29 deletions(-)
>>>>>>
>>>>>> diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
>>>>>> index 833ce2c..b8d9445 100644
>>>>>> --- a/arch/powerpc/include/asm/epapr_hcalls.h
>>>>>> +++ b/arch/powerpc/include/asm/epapr_hcalls.h
>>>>>> @@ -195,7 +195,7 @@ static inline unsigned int ev_int_set_config(unsigned int interrupt,
>>>>>> 	r5  = priority;
>>>>>> 	r6  = destination;
>>>>>>
>>>>>> -	__asm__ __volatile__ ("sc 1"
>>>>>> +	asm volatile("bl	epapr_hypercall_start"
>>>>>> 		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
>>>>>> 		: : EV_HCALL_CLOBBERS4
>>>>>
>>>>> Hrm. ePAPR hypercalls are allowed to clobber lr, right? But our hypercall entry code depends on lr staying alive:
>>>>
>>>> ePAPR 1.1 says LR is nonvolatile.
>>>
>>> Why is it in the clobber list then? 
>>
>> Because the inline assembly code is clobbering it -- not the hv-provided
>> hcall instructions.
> 
> Only after the change, not before it.

Hmm.  The comment says, "XER, CTR, and LR are currently listed as
clobbers because it's uncertain whether they will be clobbered."  Maybe
it dates back to when the ABI was still being discussed?  Timur, do you
recall?

In any case, LR is nonvolatile in the spec and in the implementations I
know about (KVM and Topaz).

-Scott

--
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
Timur Tabi - July 2, 2012, 5:34 p.m.
Scott Wood wrote:

> Hmm.  The comment says, "XER, CTR, and LR are currently listed as
> clobbers because it's uncertain whether they will be clobbered."  Maybe
> it dates back to when the ABI was still being discussed?  Timur, do you
> recall?

Nope, sorry.  I'm sure we discussed this and looked at the code.  My guess
is that we weren't certain what the compiler was going to do at the time.

I'm still a little confused.  Which inline assembly code is clobbering LR?
 Are you talking about the "BL" instruction, which wasn't there before?
Scott Wood - July 2, 2012, 5:43 p.m.
On 07/02/2012 12:34 PM, Timur Tabi wrote:
> Scott Wood wrote:
> 
>> Hmm.  The comment says, "XER, CTR, and LR are currently listed as
>> clobbers because it's uncertain whether they will be clobbered."  Maybe
>> it dates back to when the ABI was still being discussed?  Timur, do you
>> recall?
> 
> Nope, sorry.  I'm sure we discussed this and looked at the code.  My guess
> is that we weren't certain what the compiler was going to do at the time.

I'm not sure how the compiler is involved here -- we're just telling it
what our asm code (and the asm code in the hypervisor) will do.

>  I'm still a little confused.  Which inline assembly code is clobbering LR?
>  Are you talking about the "BL" instruction, which wasn't there before?

Yes, I didn't realize that LR had been in the clobber list before that.

-Scott

--
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
Timur Tabi - July 2, 2012, 5:53 p.m.
Scott Wood wrote:
>> >  I'm still a little confused.  Which inline assembly code is clobbering LR?
>> >  Are you talking about the "BL" instruction, which wasn't there before?

> Yes, I didn't realize that LR had been in the clobber list before that.

So are you saying that it was wrong before, but it's correct now?
Scott Wood - July 2, 2012, 5:57 p.m.
On 07/02/2012 12:53 PM, Timur Tabi wrote:
> Scott Wood wrote:
>>>>  I'm still a little confused.  Which inline assembly code is clobbering LR?
>>>>  Are you talking about the "BL" instruction, which wasn't there before?
> 
>> Yes, I didn't realize that LR had been in the clobber list before that.
> 
> So are you saying that it was wrong before, but it's correct now?

Not really *wrong* before, but unnecessary.

-Scott

--
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
Timur Tabi - July 2, 2012, 6:02 p.m.
Scott Wood wrote:
>> > So are you saying that it was wrong before, but it's correct now?

> Not really *wrong* before, but unnecessary.

In that case, my code was really just ahead of its time. :-)
Yoder Stuart-B08248 - July 3, 2012, 3:22 p.m.
> -----Original Message-----

> From: Wood Scott-B07421

> Sent: Monday, July 02, 2012 12:25 PM

> To: Alexander Graf

> Cc: Yoder Stuart-B08248; kvm-ppc@vger.kernel.org; kvm@vger.kernel.org; Tabi Timur-B04825

> Subject: Re: [PATCH v11 8/8] PPC: Don't use hardcoded opcode for ePAPR hcall invocation

> 

> On 07/02/2012 12:17 PM, Alexander Graf wrote:

> >

> > On 02.07.2012, at 19:16, Scott Wood wrote:

> >

> >> On 07/02/2012 12:13 PM, Alexander Graf wrote:

> >>>

> >>> On 02.07.2012, at 19:10, Scott Wood wrote:

> >>>

> >>>> On 07/02/2012 07:30 AM, Alexander Graf wrote:

> >>>>>

> >>>>> On 22.06.2012, at 22:06, Stuart Yoder wrote:

> >>>>>

> >>>>>> From: Liu Yu-B13201 <Yu.Liu@freescale.com>

> >>>>>>

> >>>>>> Signed-off-by: Liu Yu <yu.liu@freescale.com>

> >>>>>> Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>

> >>>>>> ---

> >>>>>> -v11: no changes

> >>>>>>

> >>>>>> arch/powerpc/include/asm/epapr_hcalls.h |   22 +++++++++---------

> >>>>>> arch/powerpc/include/asm/fsl_hcalls.h   |   36 +++++++++++++++---------------

> >>>>>> 2 files changed, 29 insertions(+), 29 deletions(-)

> >>>>>>

> >>>>>> diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h

> >>>>>> index 833ce2c..b8d9445 100644

> >>>>>> --- a/arch/powerpc/include/asm/epapr_hcalls.h

> >>>>>> +++ b/arch/powerpc/include/asm/epapr_hcalls.h

> >>>>>> @@ -195,7 +195,7 @@ static inline unsigned int ev_int_set_config(unsigned int interrupt,

> >>>>>> 	r5  = priority;

> >>>>>> 	r6  = destination;

> >>>>>>

> >>>>>> -	__asm__ __volatile__ ("sc 1"

> >>>>>> +	asm volatile("bl	epapr_hypercall_start"

> >>>>>> 		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)

> >>>>>> 		: : EV_HCALL_CLOBBERS4

> >>>>>

> >>>>> Hrm. ePAPR hypercalls are allowed to clobber lr, right? But our hypercall entry code depends on lr

> staying alive:

> >>>>

> >>>> ePAPR 1.1 says LR is nonvolatile.

> >>>

> >>> Why is it in the clobber list then?

> >>

> >> Because the inline assembly code is clobbering it -- not the hv-provided

> >> hcall instructions.

> >

> > Only after the change, not before it.

> 

> Hmm.  The comment says, "XER, CTR, and LR are currently listed as

> clobbers because it's uncertain whether they will be clobbered."  Maybe

> it dates back to when the ABI was still being discussed?  Timur, do you

> recall?

> 

> In any case, LR is nonvolatile in the spec and in the implementations I

> know about (KVM and Topaz).


Based on this thread I am going to leave this patch as is.

Stuart

Patch

diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
index 833ce2c..b8d9445 100644
--- a/arch/powerpc/include/asm/epapr_hcalls.h
+++ b/arch/powerpc/include/asm/epapr_hcalls.h
@@ -195,7 +195,7 @@  static inline unsigned int ev_int_set_config(unsigned int interrupt,
 	r5  = priority;
 	r6  = destination;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
 		: : EV_HCALL_CLOBBERS4
 	);
@@ -224,7 +224,7 @@  static inline unsigned int ev_int_get_config(unsigned int interrupt,
 	r11 = EV_HCALL_TOKEN(EV_INT_GET_CONFIG);
 	r3 = interrupt;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "=r" (r4), "=r" (r5), "=r" (r6)
 		: : EV_HCALL_CLOBBERS4
 	);
@@ -254,7 +254,7 @@  static inline unsigned int ev_int_set_mask(unsigned int interrupt,
 	r3 = interrupt;
 	r4 = mask;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "+r" (r4)
 		: : EV_HCALL_CLOBBERS2
 	);
@@ -279,7 +279,7 @@  static inline unsigned int ev_int_get_mask(unsigned int interrupt,
 	r11 = EV_HCALL_TOKEN(EV_INT_GET_MASK);
 	r3 = interrupt;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "=r" (r4)
 		: : EV_HCALL_CLOBBERS2
 	);
@@ -307,7 +307,7 @@  static inline unsigned int ev_int_eoi(unsigned int interrupt)
 	r11 = EV_HCALL_TOKEN(EV_INT_EOI);
 	r3 = interrupt;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);
@@ -346,7 +346,7 @@  static inline unsigned int ev_byte_channel_send(unsigned int handle,
 	r7 = be32_to_cpu(p[2]);
 	r8 = be32_to_cpu(p[3]);
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3),
 		  "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7), "+r" (r8)
 		: : EV_HCALL_CLOBBERS6
@@ -385,7 +385,7 @@  static inline unsigned int ev_byte_channel_receive(unsigned int handle,
 	r3 = handle;
 	r4 = *count;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "+r" (r4),
 		  "=r" (r5), "=r" (r6), "=r" (r7), "=r" (r8)
 		: : EV_HCALL_CLOBBERS6
@@ -423,7 +423,7 @@  static inline unsigned int ev_byte_channel_poll(unsigned int handle,
 	r11 = EV_HCALL_TOKEN(EV_BYTE_CHANNEL_POLL);
 	r3 = handle;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "=r" (r4), "=r" (r5)
 		: : EV_HCALL_CLOBBERS3
 	);
@@ -456,7 +456,7 @@  static inline unsigned int ev_int_iack(unsigned int handle,
 	r11 = EV_HCALL_TOKEN(EV_INT_IACK);
 	r3 = handle;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "=r" (r4)
 		: : EV_HCALL_CLOBBERS2
 	);
@@ -480,7 +480,7 @@  static inline unsigned int ev_doorbell_send(unsigned int handle)
 	r11 = EV_HCALL_TOKEN(EV_DOORBELL_SEND);
 	r3 = handle;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);
@@ -500,7 +500,7 @@  static inline unsigned int ev_idle(void)
 
 	r11 = EV_HCALL_TOKEN(EV_IDLE);
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "=r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);
diff --git a/arch/powerpc/include/asm/fsl_hcalls.h b/arch/powerpc/include/asm/fsl_hcalls.h
index 922d9b5..3abb583 100644
--- a/arch/powerpc/include/asm/fsl_hcalls.h
+++ b/arch/powerpc/include/asm/fsl_hcalls.h
@@ -96,7 +96,7 @@  static inline unsigned int fh_send_nmi(unsigned int vcpu_mask)
 	r11 = FH_HCALL_TOKEN(FH_SEND_NMI);
 	r3 = vcpu_mask;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);
@@ -151,7 +151,7 @@  static inline unsigned int fh_partition_get_dtprop(int handle,
 	r9 = (uint32_t)propvalue_addr;
 	r10 = *propvalue_len;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11),
 		  "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7),
 		  "+r" (r8), "+r" (r9), "+r" (r10)
@@ -205,7 +205,7 @@  static inline unsigned int fh_partition_set_dtprop(int handle,
 	r9 = (uint32_t)propvalue_addr;
 	r10 = propvalue_len;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11),
 		  "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7),
 		  "+r" (r8), "+r" (r9), "+r" (r10)
@@ -229,7 +229,7 @@  static inline unsigned int fh_partition_restart(unsigned int partition)
 	r11 = FH_HCALL_TOKEN(FH_PARTITION_RESTART);
 	r3 = partition;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);
@@ -262,7 +262,7 @@  static inline unsigned int fh_partition_get_status(unsigned int partition,
 	r11 = FH_HCALL_TOKEN(FH_PARTITION_GET_STATUS);
 	r3 = partition;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "=r" (r4)
 		: : EV_HCALL_CLOBBERS2
 	);
@@ -295,7 +295,7 @@  static inline unsigned int fh_partition_start(unsigned int partition,
 	r4 = entry_point;
 	r5 = load;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5)
 		: : EV_HCALL_CLOBBERS3
 	);
@@ -317,7 +317,7 @@  static inline unsigned int fh_partition_stop(unsigned int partition)
 	r11 = FH_HCALL_TOKEN(FH_PARTITION_STOP);
 	r3 = partition;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);
@@ -376,7 +376,7 @@  static inline unsigned int fh_partition_memcpy(unsigned int source,
 #endif
 	r7 = count;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11),
 		  "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7)
 		: : EV_HCALL_CLOBBERS5
@@ -399,7 +399,7 @@  static inline unsigned int fh_dma_enable(unsigned int liodn)
 	r11 = FH_HCALL_TOKEN(FH_DMA_ENABLE);
 	r3 = liodn;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);
@@ -421,7 +421,7 @@  static inline unsigned int fh_dma_disable(unsigned int liodn)
 	r11 = FH_HCALL_TOKEN(FH_DMA_DISABLE);
 	r3 = liodn;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);
@@ -447,7 +447,7 @@  static inline unsigned int fh_vmpic_get_msir(unsigned int interrupt,
 	r11 = FH_HCALL_TOKEN(FH_VMPIC_GET_MSIR);
 	r3 = interrupt;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "=r" (r4)
 		: : EV_HCALL_CLOBBERS2
 	);
@@ -469,7 +469,7 @@  static inline unsigned int fh_system_reset(void)
 
 	r11 = FH_HCALL_TOKEN(FH_SYSTEM_RESET);
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "=r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);
@@ -506,7 +506,7 @@  static inline unsigned int fh_err_get_info(int queue, uint32_t *bufsize,
 	r6 = addr_lo;
 	r7 = peek;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6),
 		  "+r" (r7)
 		: : EV_HCALL_CLOBBERS5
@@ -542,7 +542,7 @@  static inline unsigned int fh_get_core_state(unsigned int handle,
 	r3 = handle;
 	r4 = vcpu;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "+r" (r4)
 		: : EV_HCALL_CLOBBERS2
 	);
@@ -572,7 +572,7 @@  static inline unsigned int fh_enter_nap(unsigned int handle, unsigned int vcpu)
 	r3 = handle;
 	r4 = vcpu;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "+r" (r4)
 		: : EV_HCALL_CLOBBERS2
 	);
@@ -597,7 +597,7 @@  static inline unsigned int fh_exit_nap(unsigned int handle, unsigned int vcpu)
 	r3 = handle;
 	r4 = vcpu;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3), "+r" (r4)
 		: : EV_HCALL_CLOBBERS2
 	);
@@ -618,7 +618,7 @@  static inline unsigned int fh_claim_device(unsigned int handle)
 	r11 = FH_HCALL_TOKEN(FH_CLAIM_DEVICE);
 	r3 = handle;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);
@@ -645,7 +645,7 @@  static inline unsigned int fh_partition_stop_dma(unsigned int handle)
 	r11 = FH_HCALL_TOKEN(FH_PARTITION_STOP_DMA);
 	r3 = handle;
 
-	__asm__ __volatile__ ("sc 1"
+	asm volatile("bl	epapr_hypercall_start"
 		: "+r" (r11), "+r" (r3)
 		: : EV_HCALL_CLOBBERS1
 	);