Merge commit 'origin/queue' into for-queue
authorAlexander Graf <agraf@suse.de>
Wed, 31 Oct 2012 12:36:18 +0000 (13:36 +0100)
committerAlexander Graf <agraf@suse.de>
Wed, 31 Oct 2012 12:36:18 +0000 (13:36 +0100)
Conflicts:
arch/powerpc/include/asm/Kbuild
arch/powerpc/include/uapi/asm/Kbuild

1  2 
arch/powerpc/include/asm/smp.h
arch/powerpc/include/uapi/asm/Kbuild
arch/powerpc/include/uapi/asm/epapr_hcalls.h
arch/powerpc/kernel/smp.c
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/book3s_hv_rmhandlers.S

index b625a1a9ad16db620f2a5e8cb88d12c803feee00,e807e9d8e3f7ea60b184da83176d54b3bbb40dcd..5a4e437c238d814ad421c4c0c3eff12391cf316f
@@@ -65,15 -65,8 +65,16 @@@ int generic_cpu_disable(void)
  void generic_cpu_die(unsigned int cpu);
  void generic_mach_cpu_die(void);
  void generic_set_cpu_dead(unsigned int cpu);
+ void generic_set_cpu_up(unsigned int cpu);
  int generic_check_cpu_restart(unsigned int cpu);
 +
 +extern void inhibit_secondary_onlining(void);
 +extern void uninhibit_secondary_onlining(void);
 +
 +#else /* HOTPLUG_CPU */
 +static inline void inhibit_secondary_onlining(void) {}
 +static inline void uninhibit_secondary_onlining(void) {}
 +
  #endif
  
  #ifdef CONFIG_PPC64
index e6b5be86e4fa343655df3932ee19f2d7c546cf49,9eedfc5a557bb3b583b2d3c6f052c5ae7b30b6af..f7bca6370745b49133a771d9aff43a742116b229
@@@ -1,4 -1,45 +1,45 @@@
  # UAPI Header export list
  include include/uapi/asm-generic/Kbuild.asm
  
 -header-y += epapr_hcalls.h
+ header-y += auxvec.h
+ header-y += bitsperlong.h
+ header-y += bootx.h
+ header-y += byteorder.h
+ header-y += cputable.h
+ header-y += elf.h
 +header-y += epapr_hcalls.h
+ header-y += errno.h
+ header-y += fcntl.h
+ header-y += ioctl.h
+ header-y += ioctls.h
+ header-y += ipcbuf.h
+ header-y += kvm.h
+ header-y += kvm_para.h
+ header-y += linkage.h
+ header-y += mman.h
+ header-y += msgbuf.h
+ header-y += nvram.h
+ header-y += param.h
+ header-y += poll.h
+ header-y += posix_types.h
+ header-y += ps3fb.h
+ header-y += ptrace.h
+ header-y += resource.h
+ header-y += seccomp.h
+ header-y += sembuf.h
+ header-y += setup.h
+ header-y += shmbuf.h
+ header-y += sigcontext.h
+ header-y += siginfo.h
+ header-y += signal.h
+ header-y += socket.h
+ header-y += sockios.h
+ header-y += spu_info.h
+ header-y += stat.h
+ header-y += statfs.h
+ header-y += swab.h
+ header-y += termbits.h
+ header-y += termios.h
+ header-y += types.h
+ header-y += ucontext.h
+ header-y += unistd.h
index 046c79364f83dca69fb36cd7a9ca966774154244,b8d94459a929d6d1c74203bd40d03b6ab8bea9ab..58997afcd0853b9cda35b006141db65dbe156459
   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
- #ifndef _UAPI__EPAPR_HCALLS_H
- #define _UAPI__EPAPR_HCALLS_H
- #define EV_BYTE_CHANNEL_SEND          1
- #define EV_BYTE_CHANNEL_RECEIVE               2
- #define EV_BYTE_CHANNEL_POLL          3
- #define EV_INT_SET_CONFIG             4
- #define EV_INT_GET_CONFIG             5
- #define EV_INT_SET_MASK                       6
- #define EV_INT_GET_MASK                       7
- #define EV_INT_IACK                   9
- #define EV_INT_EOI                    10
- #define EV_INT_SEND_IPI                       11
- #define EV_INT_SET_TASK_PRIORITY      12
- #define EV_INT_GET_TASK_PRIORITY      13
- #define EV_DOORBELL_SEND              14
- #define EV_MSGSND                     15
- #define EV_IDLE                               16
- /* vendor ID: epapr */
- #define EV_LOCAL_VENDOR_ID            0       /* for private use */
- #define EV_EPAPR_VENDOR_ID            1
- #define EV_FSL_VENDOR_ID              2       /* Freescale Semiconductor */
- #define EV_IBM_VENDOR_ID              3       /* IBM */
- #define EV_GHS_VENDOR_ID              4       /* Green Hills Software */
- #define EV_ENEA_VENDOR_ID             5       /* Enea */
- #define EV_WR_VENDOR_ID                       6       /* Wind River Systems */
- #define EV_AMCC_VENDOR_ID             7       /* Applied Micro Circuits */
- #define EV_KVM_VENDOR_ID              42      /* KVM */
- /* The max number of bytes that a byte channel can send or receive per call */
- #define EV_BYTE_CHANNEL_MAX_BYTES     16
- #define _EV_HCALL_TOKEN(id, num) (((id) << 16) | (num))
- #define EV_HCALL_TOKEN(hcall_num) _EV_HCALL_TOKEN(EV_EPAPR_VENDOR_ID, hcall_num)
- /* epapr return codes */
- #define EV_SUCCESS            0
- #define EV_EPERM              1       /* Operation not permitted */
- #define EV_ENOENT             2       /*  Entry Not Found */
- #define EV_EIO                        3       /* I/O error occured */
- #define EV_EAGAIN             4       /* The operation had insufficient
-                                        * resources to complete and should be
-                                        * retried
-                                        */
- #define EV_ENOMEM             5       /* There was insufficient memory to
-                                        * complete the operation */
- #define EV_EFAULT             6       /* Bad guest address */
- #define EV_ENODEV             7       /* No such device */
- #define EV_EINVAL             8       /* An argument supplied to the hcall
-                                          was out of range or invalid */
- #define EV_INTERNAL           9       /* An internal error occured */
- #define EV_CONFIG             10      /* A configuration error was detected */
- #define EV_INVALID_STATE      11      /* The object is in an invalid state */
- #define EV_UNIMPLEMENTED      12      /* Unimplemented hypercall */
- #define EV_BUFFER_OVERFLOW    13      /* Caller-supplied buffer too small */
- #endif /* _UAPI__EPAPR_HCALLS_H */
+ /* A "hypercall" is an "sc 1" instruction.  This header file file provides C
+  * wrapper functions for the ePAPR hypervisor interface.  It is inteded
+  * for use by Linux device drivers and other operating systems.
+  *
+  * The hypercalls are implemented as inline assembly, rather than assembly
+  * language functions in a .S file, for optimization.  It allows
+  * the caller to issue the hypercall instruction directly, improving both
+  * performance and memory footprint.
+  */
+ #ifndef _EPAPR_HCALLS_H
+ #define _EPAPR_HCALLS_H
 -#define EV_BYTE_CHANNEL_SEND          1
 -#define EV_BYTE_CHANNEL_RECEIVE               2
 -#define EV_BYTE_CHANNEL_POLL          3
 -#define EV_INT_SET_CONFIG             4
 -#define EV_INT_GET_CONFIG             5
 -#define EV_INT_SET_MASK                       6
 -#define EV_INT_GET_MASK                       7
 -#define EV_INT_IACK                   9
 -#define EV_INT_EOI                    10
 -#define EV_INT_SEND_IPI                       11
 -#define EV_INT_SET_TASK_PRIORITY      12
 -#define EV_INT_GET_TASK_PRIORITY      13
 -#define EV_DOORBELL_SEND              14
 -#define EV_MSGSND                     15
 -#define EV_IDLE                               16
 -
 -/* vendor ID: epapr */
 -#define EV_LOCAL_VENDOR_ID            0       /* for private use */
 -#define EV_EPAPR_VENDOR_ID            1
 -#define EV_FSL_VENDOR_ID              2       /* Freescale Semiconductor */
 -#define EV_IBM_VENDOR_ID              3       /* IBM */
 -#define EV_GHS_VENDOR_ID              4       /* Green Hills Software */
 -#define EV_ENEA_VENDOR_ID             5       /* Enea */
 -#define EV_WR_VENDOR_ID                       6       /* Wind River Systems */
 -#define EV_AMCC_VENDOR_ID             7       /* Applied Micro Circuits */
 -#define EV_KVM_VENDOR_ID              42      /* KVM */
 -
 -/* The max number of bytes that a byte channel can send or receive per call */
 -#define EV_BYTE_CHANNEL_MAX_BYTES     16
 -
 -
 -#define _EV_HCALL_TOKEN(id, num) (((id) << 16) | (num))
 -#define EV_HCALL_TOKEN(hcall_num) _EV_HCALL_TOKEN(EV_EPAPR_VENDOR_ID, hcall_num)
 -
 -/* epapr return codes */
 -#define EV_SUCCESS            0
 -#define EV_EPERM              1       /* Operation not permitted */
 -#define EV_ENOENT             2       /*  Entry Not Found */
 -#define EV_EIO                        3       /* I/O error occured */
 -#define EV_EAGAIN             4       /* The operation had insufficient
 -                                       * resources to complete and should be
 -                                       * retried
 -                                       */
 -#define EV_ENOMEM             5       /* There was insufficient memory to
 -                                       * complete the operation */
 -#define EV_EFAULT             6       /* Bad guest address */
 -#define EV_ENODEV             7       /* No such device */
 -#define EV_EINVAL             8       /* An argument supplied to the hcall
 -                                         was out of range or invalid */
 -#define EV_INTERNAL           9       /* An internal error occured */
 -#define EV_CONFIG             10      /* A configuration error was detected */
 -#define EV_INVALID_STATE      11      /* The object is in an invalid state */
 -#define EV_UNIMPLEMENTED      12      /* Unimplemented hypercall */
 -#define EV_BUFFER_OVERFLOW    13      /* Caller-supplied buffer too small */
++#include <uapi/asm/epapr_hcalls.h>
+ #ifndef __ASSEMBLY__
+ #include <linux/types.h>
+ #include <linux/errno.h>
+ #include <asm/byteorder.h>
+ /*
+  * Hypercall register clobber list
+  *
+  * These macros are used to define the list of clobbered registers during a
+  * hypercall.  Technically, registers r0 and r3-r12 are always clobbered,
+  * but the gcc inline assembly syntax does not allow us to specify registers
+  * on the clobber list that are also on the input/output list.  Therefore,
+  * the lists of clobbered registers depends on the number of register
+  * parmeters ("+r" and "=r") passed to the hypercall.
+  *
+  * Each assembly block should use one of the HCALL_CLOBBERSx macros.  As a
+  * general rule, 'x' is the number of parameters passed to the assembly
+  * block *except* for r11.
+  *
+  * If you're not sure, just use the smallest value of 'x' that does not
+  * generate a compilation error.  Because these are static inline functions,
+  * the compiler will only check the clobber list for a function if you
+  * compile code that calls that function.
+  *
+  * r3 and r11 are not included in any clobbers list because they are always
+  * listed as output registers.
+  *
+  * XER, CTR, and LR are currently listed as clobbers because it's uncertain
+  * whether they will be clobbered.
+  *
+  * Note that r11 can be used as an output parameter.
+  *
+  * The "memory" clobber is only necessary for hcalls where the Hypervisor
+  * will read or write guest memory. However, we add it to all hcalls because
+  * the impact is minimal, and we want to ensure that it's present for the
+  * hcalls that need it.
+ */
+ /* List of common clobbered registers.  Do not use this macro. */
+ #define EV_HCALL_CLOBBERS "r0", "r12", "xer", "ctr", "lr", "cc", "memory"
+ #define EV_HCALL_CLOBBERS8 EV_HCALL_CLOBBERS
+ #define EV_HCALL_CLOBBERS7 EV_HCALL_CLOBBERS8, "r10"
+ #define EV_HCALL_CLOBBERS6 EV_HCALL_CLOBBERS7, "r9"
+ #define EV_HCALL_CLOBBERS5 EV_HCALL_CLOBBERS6, "r8"
+ #define EV_HCALL_CLOBBERS4 EV_HCALL_CLOBBERS5, "r7"
+ #define EV_HCALL_CLOBBERS3 EV_HCALL_CLOBBERS4, "r6"
+ #define EV_HCALL_CLOBBERS2 EV_HCALL_CLOBBERS3, "r5"
+ #define EV_HCALL_CLOBBERS1 EV_HCALL_CLOBBERS2, "r4"
+ extern bool epapr_paravirt_enabled;
+ extern u32 epapr_hypercall_start[];
+ /*
+  * We use "uintptr_t" to define a register because it's guaranteed to be a
+  * 32-bit integer on a 32-bit platform, and a 64-bit integer on a 64-bit
+  * platform.
+  *
+  * All registers are either input/output or output only.  Registers that are
+  * initialized before making the hypercall are input/output.  All
+  * input/output registers are represented with "+r".  Output-only registers
+  * are represented with "=r".  Do not specify any unused registers.  The
+  * clobber list will tell the compiler that the hypercall modifies those
+  * registers, which is good enough.
+  */
+ /**
+  * ev_int_set_config - configure the specified interrupt
+  * @interrupt: the interrupt number
+  * @config: configuration for this interrupt
+  * @priority: interrupt priority
+  * @destination: destination CPU number
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_int_set_config(unsigned int interrupt,
+       uint32_t config, unsigned int priority, uint32_t destination)
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+       r11 = EV_HCALL_TOKEN(EV_INT_SET_CONFIG);
+       r3  = interrupt;
+       r4  = config;
+       r5  = priority;
+       r6  = destination;
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
+               : : EV_HCALL_CLOBBERS4
+       );
+       return r3;
+ }
+ /**
+  * ev_int_get_config - return the config of the specified interrupt
+  * @interrupt: the interrupt number
+  * @config: returned configuration for this interrupt
+  * @priority: returned interrupt priority
+  * @destination: returned destination CPU number
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_int_get_config(unsigned int interrupt,
+       uint32_t *config, unsigned int *priority, uint32_t *destination)
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+       r11 = EV_HCALL_TOKEN(EV_INT_GET_CONFIG);
+       r3 = interrupt;
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "+r" (r3), "=r" (r4), "=r" (r5), "=r" (r6)
+               : : EV_HCALL_CLOBBERS4
+       );
+       *config = r4;
+       *priority = r5;
+       *destination = r6;
+       return r3;
+ }
+ /**
+  * ev_int_set_mask - sets the mask for the specified interrupt source
+  * @interrupt: the interrupt number
+  * @mask: 0=enable interrupts, 1=disable interrupts
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_int_set_mask(unsigned int interrupt,
+       unsigned int mask)
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       r11 = EV_HCALL_TOKEN(EV_INT_SET_MASK);
+       r3 = interrupt;
+       r4 = mask;
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "+r" (r3), "+r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+       return r3;
+ }
+ /**
+  * ev_int_get_mask - returns the mask for the specified interrupt source
+  * @interrupt: the interrupt number
+  * @mask: returned mask for this interrupt (0=enabled, 1=disabled)
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_int_get_mask(unsigned int interrupt,
+       unsigned int *mask)
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       r11 = EV_HCALL_TOKEN(EV_INT_GET_MASK);
+       r3 = interrupt;
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "+r" (r3), "=r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+       *mask = r4;
+       return r3;
+ }
+ /**
+  * ev_int_eoi - signal the end of interrupt processing
+  * @interrupt: the interrupt number
+  *
+  * This function signals the end of processing for the the specified
+  * interrupt, which must be the interrupt currently in service. By
+  * definition, this is also the highest-priority interrupt.
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_int_eoi(unsigned int interrupt)
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       r11 = EV_HCALL_TOKEN(EV_INT_EOI);
+       r3 = interrupt;
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+       return r3;
+ }
+ /**
+  * ev_byte_channel_send - send characters to a byte stream
+  * @handle: byte stream handle
+  * @count: (input) num of chars to send, (output) num chars sent
+  * @buffer: pointer to a 16-byte buffer
+  *
+  * @buffer must be at least 16 bytes long, because all 16 bytes will be
+  * read from memory into registers, even if count < 16.
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_byte_channel_send(unsigned int handle,
+       unsigned int *count, const char buffer[EV_BYTE_CHANNEL_MAX_BYTES])
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+       register uintptr_t r7 __asm__("r7");
+       register uintptr_t r8 __asm__("r8");
+       const uint32_t *p = (const uint32_t *) buffer;
+       r11 = EV_HCALL_TOKEN(EV_BYTE_CHANNEL_SEND);
+       r3 = handle;
+       r4 = *count;
+       r5 = be32_to_cpu(p[0]);
+       r6 = be32_to_cpu(p[1]);
+       r7 = be32_to_cpu(p[2]);
+       r8 = be32_to_cpu(p[3]);
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "+r" (r3),
+                 "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7), "+r" (r8)
+               : : EV_HCALL_CLOBBERS6
+       );
+       *count = r4;
+       return r3;
+ }
+ /**
+  * ev_byte_channel_receive - fetch characters from a byte channel
+  * @handle: byte channel handle
+  * @count: (input) max num of chars to receive, (output) num chars received
+  * @buffer: pointer to a 16-byte buffer
+  *
+  * The size of @buffer must be at least 16 bytes, even if you request fewer
+  * than 16 characters, because we always write 16 bytes to @buffer.  This is
+  * for performance reasons.
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_byte_channel_receive(unsigned int handle,
+       unsigned int *count, char buffer[EV_BYTE_CHANNEL_MAX_BYTES])
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+       register uintptr_t r7 __asm__("r7");
+       register uintptr_t r8 __asm__("r8");
+       uint32_t *p = (uint32_t *) buffer;
+       r11 = EV_HCALL_TOKEN(EV_BYTE_CHANNEL_RECEIVE);
+       r3 = handle;
+       r4 = *count;
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "+r" (r3), "+r" (r4),
+                 "=r" (r5), "=r" (r6), "=r" (r7), "=r" (r8)
+               : : EV_HCALL_CLOBBERS6
+       );
+       *count = r4;
+       p[0] = cpu_to_be32(r5);
+       p[1] = cpu_to_be32(r6);
+       p[2] = cpu_to_be32(r7);
+       p[3] = cpu_to_be32(r8);
+       return r3;
+ }
+ /**
+  * ev_byte_channel_poll - returns the status of the byte channel buffers
+  * @handle: byte channel handle
+  * @rx_count: returned count of bytes in receive queue
+  * @tx_count: returned count of free space in transmit queue
+  *
+  * This function reports the amount of data in the receive queue (i.e. the
+  * number of bytes you can read), and the amount of free space in the transmit
+  * queue (i.e. the number of bytes you can write).
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_byte_channel_poll(unsigned int handle,
+       unsigned int *rx_count, unsigned int *tx_count)
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       r11 = EV_HCALL_TOKEN(EV_BYTE_CHANNEL_POLL);
+       r3 = handle;
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "+r" (r3), "=r" (r4), "=r" (r5)
+               : : EV_HCALL_CLOBBERS3
+       );
+       *rx_count = r4;
+       *tx_count = r5;
+       return r3;
+ }
+ /**
+  * ev_int_iack - acknowledge an interrupt
+  * @handle: handle to the target interrupt controller
+  * @vector: returned interrupt vector
+  *
+  * If handle is zero, the function returns the next interrupt source
+  * number to be handled irrespective of the hierarchy or cascading
+  * of interrupt controllers. If non-zero, specifies a handle to the
+  * interrupt controller that is the target of the acknowledge.
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_int_iack(unsigned int handle,
+       unsigned int *vector)
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       r11 = EV_HCALL_TOKEN(EV_INT_IACK);
+       r3 = handle;
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "+r" (r3), "=r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+       *vector = r4;
+       return r3;
+ }
+ /**
+  * ev_doorbell_send - send a doorbell to another partition
+  * @handle: doorbell send handle
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_doorbell_send(unsigned int handle)
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       r11 = EV_HCALL_TOKEN(EV_DOORBELL_SEND);
+       r3 = handle;
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+       return r3;
+ }
+ /**
+  * ev_idle -- wait for next interrupt on this core
+  *
+  * Returns 0 for success, or an error code.
+  */
+ static inline unsigned int ev_idle(void)
+ {
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       r11 = EV_HCALL_TOKEN(EV_IDLE);
+       asm volatile("bl        epapr_hypercall_start"
+               : "+r" (r11), "=r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+       return r3;
+ }
+ #endif /* !__ASSEMBLY__ */
+ #endif
Simple merge
Simple merge