aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>2012-09-14 09:33:21 -0400
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>2012-09-14 09:33:21 -0400
commitaa2466d21bd9e872690693d56feb946781443f28 (patch)
tree34f64dd0079bb963d8616cfed5c073914fbf2808 /arch
parent4c071ee5268f7234c3d084b6093bebccc28cdcba (diff)
xen/arm: hypercalls
Use r12 to pass the hypercall number to the hypervisor. We need a register to pass the hypercall number because we might not know it at compile time and HVC only takes an immediate argument. Among the available registers r12 seems to be the best choice because it is defined as "intra-procedure call scratch register". Use the ISS to pass an hypervisor specific tag. Changes in v2: - define an HYPERCALL macro for 5 arguments hypercall wrappers, even if at the moment is unused; - use ldm instead of pop; - fix up comments. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/include/asm/xen/hypercall.h50
-rw-r--r--arch/arm/xen/Makefile2
-rw-r--r--arch/arm/xen/hypercall.S106
3 files changed, 157 insertions, 1 deletions
diff --git a/arch/arm/include/asm/xen/hypercall.h b/arch/arm/include/asm/xen/hypercall.h
new file mode 100644
index 000000000000..4ac062414369
--- /dev/null
+++ b/arch/arm/include/asm/xen/hypercall.h
@@ -0,0 +1,50 @@
1/******************************************************************************
2 * hypercall.h
3 *
4 * Linux-specific hypervisor handling.
5 *
6 * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License version 2
10 * as published by the Free Software Foundation; or, when distributed
11 * separately from the Linux kernel or incorporated into other
12 * software packages, subject to the following license:
13 *
14 * Permission is hereby granted, free of charge, to any person obtaining a copy
15 * of this source file (the "Software"), to deal in the Software without
16 * restriction, including without limitation the rights to use, copy, modify,
17 * merge, publish, distribute, sublicense, and/or sell copies of the Software,
18 * and to permit persons to whom the Software is furnished to do so, subject to
19 * the following conditions:
20 *
21 * The above copyright notice and this permission notice shall be included in
22 * all copies or substantial portions of the Software.
23 *
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
30 * IN THE SOFTWARE.
31 */
32
33#ifndef _ASM_ARM_XEN_HYPERCALL_H
34#define _ASM_ARM_XEN_HYPERCALL_H
35
36#include <xen/interface/xen.h>
37
38long privcmd_call(unsigned call, unsigned long a1,
39 unsigned long a2, unsigned long a3,
40 unsigned long a4, unsigned long a5);
41int HYPERVISOR_xen_version(int cmd, void *arg);
42int HYPERVISOR_console_io(int cmd, int count, char *str);
43int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count);
44int HYPERVISOR_sched_op(int cmd, void *arg);
45int HYPERVISOR_event_channel_op(int cmd, void *arg);
46unsigned long HYPERVISOR_hvm_op(int op, void *arg);
47int HYPERVISOR_memory_op(unsigned int cmd, void *arg);
48int HYPERVISOR_physdev_op(int cmd, void *arg);
49
50#endif /* _ASM_ARM_XEN_HYPERCALL_H */
diff --git a/arch/arm/xen/Makefile b/arch/arm/xen/Makefile
index 0bad594b1490..b9d6acc45650 100644
--- a/arch/arm/xen/Makefile
+++ b/arch/arm/xen/Makefile
@@ -1 +1 @@
obj-y := enlighten.o obj-y := enlighten.o hypercall.o
diff --git a/arch/arm/xen/hypercall.S b/arch/arm/xen/hypercall.S
new file mode 100644
index 000000000000..074f5ed101b9
--- /dev/null
+++ b/arch/arm/xen/hypercall.S
@@ -0,0 +1,106 @@
1/******************************************************************************
2 * hypercall.S
3 *
4 * Xen hypercall wrappers
5 *
6 * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License version 2
10 * as published by the Free Software Foundation; or, when distributed
11 * separately from the Linux kernel or incorporated into other
12 * software packages, subject to the following license:
13 *
14 * Permission is hereby granted, free of charge, to any person obtaining a copy
15 * of this source file (the "Software"), to deal in the Software without
16 * restriction, including without limitation the rights to use, copy, modify,
17 * merge, publish, distribute, sublicense, and/or sell copies of the Software,
18 * and to permit persons to whom the Software is furnished to do so, subject to
19 * the following conditions:
20 *
21 * The above copyright notice and this permission notice shall be included in
22 * all copies or substantial portions of the Software.
23 *
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
30 * IN THE SOFTWARE.
31 */
32
33/*
34 * The Xen hypercall calling convention is very similar to the ARM
35 * procedure calling convention: the first paramter is passed in r0, the
36 * second in r1, the third in r2 and the fourth in r3. Considering that
37 * Xen hypercalls have 5 arguments at most, the fifth paramter is passed
38 * in r4, differently from the procedure calling convention of using the
39 * stack for that case.
40 *
41 * The hypercall number is passed in r12.
42 *
43 * The return value is in r0.
44 *
45 * The hvc ISS is required to be 0xEA1, that is the Xen specific ARM
46 * hypercall tag.
47 */
48
49#include <linux/linkage.h>
50#include <asm/assembler.h>
51#include <xen/interface/xen.h>
52
53
54/* HVC 0xEA1 */
55#ifdef CONFIG_THUMB2_KERNEL
56#define xen_hvc .word 0xf7e08ea1
57#else
58#define xen_hvc .word 0xe140ea71
59#endif
60
61#define HYPERCALL_SIMPLE(hypercall) \
62ENTRY(HYPERVISOR_##hypercall) \
63 mov r12, #__HYPERVISOR_##hypercall; \
64 xen_hvc; \
65 mov pc, lr; \
66ENDPROC(HYPERVISOR_##hypercall)
67
68#define HYPERCALL0 HYPERCALL_SIMPLE
69#define HYPERCALL1 HYPERCALL_SIMPLE
70#define HYPERCALL2 HYPERCALL_SIMPLE
71#define HYPERCALL3 HYPERCALL_SIMPLE
72#define HYPERCALL4 HYPERCALL_SIMPLE
73
74#define HYPERCALL5(hypercall) \
75ENTRY(HYPERVISOR_##hypercall) \
76 stmdb sp!, {r4} \
77 ldr r4, [sp, #4] \
78 mov r12, #__HYPERVISOR_##hypercall; \
79 xen_hvc \
80 ldm sp!, {r4} \
81 mov pc, lr \
82ENDPROC(HYPERVISOR_##hypercall)
83
84 .text
85
86HYPERCALL2(xen_version);
87HYPERCALL3(console_io);
88HYPERCALL3(grant_table_op);
89HYPERCALL2(sched_op);
90HYPERCALL2(event_channel_op);
91HYPERCALL2(hvm_op);
92HYPERCALL2(memory_op);
93HYPERCALL2(physdev_op);
94
95ENTRY(privcmd_call)
96 stmdb sp!, {r4}
97 mov r12, r0
98 mov r0, r1
99 mov r1, r2
100 mov r2, r3
101 ldr r3, [sp, #8]
102 ldr r4, [sp, #4]
103 xen_hvc
104 ldm sp!, {r4}
105 mov pc, lr
106ENDPROC(privcmd_call);