Explorar o código

sparc64: Add a new hypercall CPU_POKE

This adds a new hypercall CPU_POKE for quickly waking up an idle CPU.
CPU_POKE should only be sent to valid non-local CPUs.

Signed-off-by: Rob Gardner <rob.gardner@oracle.com>
Signed-off-by: Vijay Kumar <vijay.ac.kumar@oracle.com>
Reviewed-by: Anthony Yznaga <anthony.yznaga@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Vijay Kumar %!s(int64=8) %!d(string=hai) anos
pai
achega
28d43de741
Modificáronse 2 ficheiros con 29 adicións e 0 borrados
  1. 18 0
      arch/sparc/include/asm/hypervisor.h
  2. 11 0
      arch/sparc/kernel/hvcalls.S

+ 18 - 0
arch/sparc/include/asm/hypervisor.h

@@ -298,6 +298,24 @@ unsigned long sun4v_cpu_stop(unsigned long cpuid);
 unsigned long sun4v_cpu_yield(void);
 unsigned long sun4v_cpu_yield(void);
 #endif
 #endif
 
 
+/* cpu_poke()
+ * TRAP:	HV_FAST_TRAP
+ * FUNCTION:	HV_FAST_CPU_POKE
+ * RET0:	status
+ * ERRORS:	ENOCPU		cpuid refers to a CPU that does not exist
+ *		EINVAL		cpuid is current CPU
+ *
+ * Poke CPU cpuid. If the target CPU is currently suspended having
+ * invoked the cpu-yield service, that vCPU will be resumed.
+ * Poke interrupts may only be sent to valid, non-local CPUs.
+ * It is not legal to poke the current vCPU.
+ */
+#define HV_FAST_CPU_POKE                0x13
+
+#ifndef __ASSEMBLY__
+unsigned long sun4v_cpu_poke(unsigned long cpuid);
+#endif
+
 /* cpu_qconf()
 /* cpu_qconf()
  * TRAP:	HV_FAST_TRAP
  * TRAP:	HV_FAST_TRAP
  * FUNCTION:	HV_FAST_CPU_QCONF
  * FUNCTION:	HV_FAST_CPU_QCONF

+ 11 - 0
arch/sparc/kernel/hvcalls.S

@@ -106,6 +106,17 @@ ENTRY(sun4v_cpu_yield)
 	 nop
 	 nop
 ENDPROC(sun4v_cpu_yield)
 ENDPROC(sun4v_cpu_yield)
 
 
+	/* %o0: cpuid
+	 *
+	 * returns %o0:	status
+	 */
+ENTRY(sun4v_cpu_poke)
+	mov     HV_FAST_CPU_POKE, %o5
+	ta      HV_FAST_TRAP
+	retl
+	 nop
+ENDPROC(sun4v_cpu_poke)
+
 	/* %o0:	type
 	/* %o0:	type
 	 * %o1:	queue paddr
 	 * %o1:	queue paddr
 	 * %o2:	num queue entries
 	 * %o2:	num queue entries