xref: /openbmc/linux/arch/arm/xen/hypercall.S (revision aa2466d2)
1aa2466d2SStefano Stabellini/******************************************************************************
2aa2466d2SStefano Stabellini * hypercall.S
3aa2466d2SStefano Stabellini *
4aa2466d2SStefano Stabellini * Xen hypercall wrappers
5aa2466d2SStefano Stabellini *
6aa2466d2SStefano Stabellini * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012
7aa2466d2SStefano Stabellini *
8aa2466d2SStefano Stabellini * This program is free software; you can redistribute it and/or
9aa2466d2SStefano Stabellini * modify it under the terms of the GNU General Public License version 2
10aa2466d2SStefano Stabellini * as published by the Free Software Foundation; or, when distributed
11aa2466d2SStefano Stabellini * separately from the Linux kernel or incorporated into other
12aa2466d2SStefano Stabellini * software packages, subject to the following license:
13aa2466d2SStefano Stabellini *
14aa2466d2SStefano Stabellini * Permission is hereby granted, free of charge, to any person obtaining a copy
15aa2466d2SStefano Stabellini * of this source file (the "Software"), to deal in the Software without
16aa2466d2SStefano Stabellini * restriction, including without limitation the rights to use, copy, modify,
17aa2466d2SStefano Stabellini * merge, publish, distribute, sublicense, and/or sell copies of the Software,
18aa2466d2SStefano Stabellini * and to permit persons to whom the Software is furnished to do so, subject to
19aa2466d2SStefano Stabellini * the following conditions:
20aa2466d2SStefano Stabellini *
21aa2466d2SStefano Stabellini * The above copyright notice and this permission notice shall be included in
22aa2466d2SStefano Stabellini * all copies or substantial portions of the Software.
23aa2466d2SStefano Stabellini *
24aa2466d2SStefano Stabellini * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25aa2466d2SStefano Stabellini * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26aa2466d2SStefano Stabellini * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27aa2466d2SStefano Stabellini * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28aa2466d2SStefano Stabellini * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29aa2466d2SStefano Stabellini * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
30aa2466d2SStefano Stabellini * IN THE SOFTWARE.
31aa2466d2SStefano Stabellini */
32aa2466d2SStefano Stabellini
33aa2466d2SStefano Stabellini/*
34aa2466d2SStefano Stabellini * The Xen hypercall calling convention is very similar to the ARM
35aa2466d2SStefano Stabellini * procedure calling convention: the first paramter is passed in r0, the
36aa2466d2SStefano Stabellini * second in r1, the third in r2 and the fourth in r3. Considering that
37aa2466d2SStefano Stabellini * Xen hypercalls have 5 arguments at most, the fifth paramter is passed
38aa2466d2SStefano Stabellini * in r4, differently from the procedure calling convention of using the
39aa2466d2SStefano Stabellini * stack for that case.
40aa2466d2SStefano Stabellini *
41aa2466d2SStefano Stabellini * The hypercall number is passed in r12.
42aa2466d2SStefano Stabellini *
43aa2466d2SStefano Stabellini * The return value is in r0.
44aa2466d2SStefano Stabellini *
45aa2466d2SStefano Stabellini * The hvc ISS is required to be 0xEA1, that is the Xen specific ARM
46aa2466d2SStefano Stabellini * hypercall tag.
47aa2466d2SStefano Stabellini */
48aa2466d2SStefano Stabellini
49aa2466d2SStefano Stabellini#include <linux/linkage.h>
50aa2466d2SStefano Stabellini#include <asm/assembler.h>
51aa2466d2SStefano Stabellini#include <xen/interface/xen.h>
52aa2466d2SStefano Stabellini
53aa2466d2SStefano Stabellini
54aa2466d2SStefano Stabellini/* HVC 0xEA1 */
55aa2466d2SStefano Stabellini#ifdef CONFIG_THUMB2_KERNEL
56aa2466d2SStefano Stabellini#define xen_hvc .word 0xf7e08ea1
57aa2466d2SStefano Stabellini#else
58aa2466d2SStefano Stabellini#define xen_hvc .word 0xe140ea71
59aa2466d2SStefano Stabellini#endif
60aa2466d2SStefano Stabellini
61aa2466d2SStefano Stabellini#define HYPERCALL_SIMPLE(hypercall)		\
62aa2466d2SStefano StabelliniENTRY(HYPERVISOR_##hypercall)			\
63aa2466d2SStefano Stabellini	mov r12, #__HYPERVISOR_##hypercall;	\
64aa2466d2SStefano Stabellini	xen_hvc;							\
65aa2466d2SStefano Stabellini	mov pc, lr;							\
66aa2466d2SStefano StabelliniENDPROC(HYPERVISOR_##hypercall)
67aa2466d2SStefano Stabellini
68aa2466d2SStefano Stabellini#define HYPERCALL0 HYPERCALL_SIMPLE
69aa2466d2SStefano Stabellini#define HYPERCALL1 HYPERCALL_SIMPLE
70aa2466d2SStefano Stabellini#define HYPERCALL2 HYPERCALL_SIMPLE
71aa2466d2SStefano Stabellini#define HYPERCALL3 HYPERCALL_SIMPLE
72aa2466d2SStefano Stabellini#define HYPERCALL4 HYPERCALL_SIMPLE
73aa2466d2SStefano Stabellini
74aa2466d2SStefano Stabellini#define HYPERCALL5(hypercall)			\
75aa2466d2SStefano StabelliniENTRY(HYPERVISOR_##hypercall)			\
76aa2466d2SStefano Stabellini	stmdb sp!, {r4}						\
77aa2466d2SStefano Stabellini	ldr r4, [sp, #4]					\
78aa2466d2SStefano Stabellini	mov r12, #__HYPERVISOR_##hypercall;	\
79aa2466d2SStefano Stabellini	xen_hvc								\
80aa2466d2SStefano Stabellini	ldm sp!, {r4}						\
81aa2466d2SStefano Stabellini	mov pc, lr							\
82aa2466d2SStefano StabelliniENDPROC(HYPERVISOR_##hypercall)
83aa2466d2SStefano Stabellini
84aa2466d2SStefano Stabellini                .text
85aa2466d2SStefano Stabellini
86aa2466d2SStefano StabelliniHYPERCALL2(xen_version);
87aa2466d2SStefano StabelliniHYPERCALL3(console_io);
88aa2466d2SStefano StabelliniHYPERCALL3(grant_table_op);
89aa2466d2SStefano StabelliniHYPERCALL2(sched_op);
90aa2466d2SStefano StabelliniHYPERCALL2(event_channel_op);
91aa2466d2SStefano StabelliniHYPERCALL2(hvm_op);
92aa2466d2SStefano StabelliniHYPERCALL2(memory_op);
93aa2466d2SStefano StabelliniHYPERCALL2(physdev_op);
94aa2466d2SStefano Stabellini
95aa2466d2SStefano StabelliniENTRY(privcmd_call)
96aa2466d2SStefano Stabellini	stmdb sp!, {r4}
97aa2466d2SStefano Stabellini	mov r12, r0
98aa2466d2SStefano Stabellini	mov r0, r1
99aa2466d2SStefano Stabellini	mov r1, r2
100aa2466d2SStefano Stabellini	mov r2, r3
101aa2466d2SStefano Stabellini	ldr r3, [sp, #8]
102aa2466d2SStefano Stabellini	ldr r4, [sp, #4]
103aa2466d2SStefano Stabellini	xen_hvc
104aa2466d2SStefano Stabellini	ldm sp!, {r4}
105aa2466d2SStefano Stabellini	mov pc, lr
106aa2466d2SStefano StabelliniENDPROC(privcmd_call);
107