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