Patchwork [v9,4/4] KVM: PPC: epapr: Update other hypercall invoking

login
register
mail settings
Submitter Stuart Yoder
Date March 7, 2012, 11:12 p.m.
Message ID <1331161979-12759-5-git-send-email-stuart.yoder@freescale.com>
Download mbox | patch
Permalink /patch/145359/
State New
Headers show

Comments

Stuart Yoder - March 7, 2012, 11:12 p.m.
From: Liu Yu-B13201 <Yu.Liu@freescale.com>

Discard the old way that invoke hypercall,
instead, use epapr paravirt.

Signed-off-by: Liu Yu <yu.liu@freescale.com>
[stuart.yoder@freescale.com: kconfig fixes]
Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
---
v9: no changes

 arch/powerpc/include/asm/epapr_hcalls.h |   22 +++++++++---------
 arch/powerpc/include/asm/fsl_hcalls.h   |   36 +++++++++++++++---------------
 arch/powerpc/platforms/Kconfig          |    1 +
 drivers/tty/Kconfig                     |    1 +
 drivers/virt/Kconfig                    |    1 +
 5 files changed, 32 insertions(+), 29 deletions(-)
Alexander Graf - March 7, 2012, 11:37 p.m.
On 08.03.2012, at 00:12, Stuart Yoder wrote:

> From: Liu Yu-B13201 <Yu.Liu@freescale.com>
> 
> Discard the old way that invoke hypercall,
> instead, use epapr paravirt.
> 
> Signed-off-by: Liu Yu <yu.liu@freescale.com>
> [stuart.yoder@freescale.com: kconfig fixes]
> Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
> ---
> v9: no changes
> 
> arch/powerpc/include/asm/epapr_hcalls.h |   22 +++++++++---------
> arch/powerpc/include/asm/fsl_hcalls.h   |   36 +++++++++++++++---------------
> arch/powerpc/platforms/Kconfig          |    1 +
> drivers/tty/Kconfig                     |    1 +
> drivers/virt/Kconfig                    |    1 +
> 5 files changed, 32 insertions(+), 29 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
> index 78460ac..b95758d 100644
> --- a/arch/powerpc/include/asm/epapr_hcalls.h
> +++ b/arch/powerpc/include/asm/epapr_hcalls.h
> @@ -189,7 +189,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
> 	);
> @@ -218,7 +218,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
> 	);
> @@ -248,7 +248,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
> 	);
> @@ -273,7 +273,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
> 	);
> @@ -301,7 +301,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
> 	);
> @@ -340,7 +340,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
> @@ -379,7 +379,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
> @@ -417,7 +417,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
> 	);
> @@ -450,7 +450,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
> 	);
> @@ -474,7 +474,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
> 	);
> @@ -494,7 +494,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
> 	);
> diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
> index e0c0834..81e60e0 100644
> --- a/arch/powerpc/platforms/Kconfig
> +++ b/arch/powerpc/platforms/Kconfig
> @@ -90,6 +90,7 @@ config MPIC
> config PPC_EPAPR_HV_PIC
> 	bool
> 	default n
> +	select EPAPR_PARAVIRT
> 
> config MPIC_WEIRD
> 	bool
> diff --git a/drivers/tty/Kconfig b/drivers/tty/Kconfig
> index f1ea59b..9ac4bc6 100644
> --- a/drivers/tty/Kconfig
> +++ b/drivers/tty/Kconfig
> @@ -354,6 +354,7 @@ config TRACE_SINK
> config PPC_EPAPR_HV_BYTECHAN
> 	tristate "ePAPR hypervisor byte channel driver"
> 	depends on PPC
> +	select EPAPR_PARAVIRT
> 	help
> 	  This driver creates /dev entries for each ePAPR hypervisor byte
> 	  channel, thereby allowing applications to communicate with byte
> diff --git a/drivers/virt/Kconfig b/drivers/virt/Kconfig
> index 2dcdbc9..99ebdde 100644
> --- a/drivers/virt/Kconfig
> +++ b/drivers/virt/Kconfig
> @@ -15,6 +15,7 @@ if VIRT_DRIVERS
> config FSL_HV_MANAGER
> 	tristate "Freescale hypervisor management driver"
> 	depends on FSL_SOC
> +	select EPAPR_PARAVIRT

Do you maybe have older versions of topaz that don't expose a /hypervisor node for which you want to have fallback code in?


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 - March 7, 2012, 11:40 p.m.
On 03/07/2012 05:37 PM, Alexander Graf wrote:
> 
> On 08.03.2012, at 00:12, Stuart Yoder wrote:
> 
>> diff --git a/drivers/tty/Kconfig b/drivers/tty/Kconfig
>> index f1ea59b..9ac4bc6 100644
>> --- a/drivers/tty/Kconfig
>> +++ b/drivers/tty/Kconfig
>> @@ -354,6 +354,7 @@ config TRACE_SINK
>> config PPC_EPAPR_HV_BYTECHAN
>> 	tristate "ePAPR hypervisor byte channel driver"
>> 	depends on PPC
>> +	select EPAPR_PARAVIRT
>> 	help
>> 	  This driver creates /dev entries for each ePAPR hypervisor byte
>> 	  channel, thereby allowing applications to communicate with byte
>> diff --git a/drivers/virt/Kconfig b/drivers/virt/Kconfig
>> index 2dcdbc9..99ebdde 100644
>> --- a/drivers/virt/Kconfig
>> +++ b/drivers/virt/Kconfig
>> @@ -15,6 +15,7 @@ if VIRT_DRIVERS
>> config FSL_HV_MANAGER
>> 	tristate "Freescale hypervisor management driver"
>> 	depends on FSL_SOC
>> +	select EPAPR_PARAVIRT
> 
> Do you maybe have older versions of topaz that don't expose a /hypervisor node for which you want to have fallback code in?

Probably not that lack a /hypervisor altogether, but it's possible
someone's using a Topaz that's too old to have hcall-instructions, which
was added about a year and a half ago.

-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

Patch

diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
index 78460ac..b95758d 100644
--- a/arch/powerpc/include/asm/epapr_hcalls.h
+++ b/arch/powerpc/include/asm/epapr_hcalls.h
@@ -189,7 +189,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
 	);
@@ -218,7 +218,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
 	);
@@ -248,7 +248,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
 	);
@@ -273,7 +273,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
 	);
@@ -301,7 +301,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
 	);
@@ -340,7 +340,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
@@ -379,7 +379,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
@@ -417,7 +417,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
 	);
@@ -450,7 +450,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
 	);
@@ -474,7 +474,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
 	);
@@ -494,7 +494,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
 	);
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index e0c0834..81e60e0 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -90,6 +90,7 @@  config MPIC
 config PPC_EPAPR_HV_PIC
 	bool
 	default n
+	select EPAPR_PARAVIRT
 
 config MPIC_WEIRD
 	bool
diff --git a/drivers/tty/Kconfig b/drivers/tty/Kconfig
index f1ea59b..9ac4bc6 100644
--- a/drivers/tty/Kconfig
+++ b/drivers/tty/Kconfig
@@ -354,6 +354,7 @@  config TRACE_SINK
 config PPC_EPAPR_HV_BYTECHAN
 	tristate "ePAPR hypervisor byte channel driver"
 	depends on PPC
+	select EPAPR_PARAVIRT
 	help
 	  This driver creates /dev entries for each ePAPR hypervisor byte
 	  channel, thereby allowing applications to communicate with byte
diff --git a/drivers/virt/Kconfig b/drivers/virt/Kconfig
index 2dcdbc9..99ebdde 100644
--- a/drivers/virt/Kconfig
+++ b/drivers/virt/Kconfig
@@ -15,6 +15,7 @@  if VIRT_DRIVERS
 config FSL_HV_MANAGER
 	tristate "Freescale hypervisor management driver"
 	depends on FSL_SOC
+	select EPAPR_PARAVIRT
 	help
           The Freescale hypervisor management driver provides several services
 	  to drivers and applications related to the Freescale hypervisor: