xref: /openbmc/linux/arch/arm64/xen/hypercall.S (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1aa42aa13SStefano Stabellini/******************************************************************************
2aa42aa13SStefano Stabellini * hypercall.S
3aa42aa13SStefano Stabellini *
4aa42aa13SStefano Stabellini * Xen hypercall wrappers
5aa42aa13SStefano Stabellini *
6aa42aa13SStefano Stabellini * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012
7aa42aa13SStefano Stabellini *
8aa42aa13SStefano Stabellini * This program is free software; you can redistribute it and/or
9aa42aa13SStefano Stabellini * modify it under the terms of the GNU General Public License version 2
10aa42aa13SStefano Stabellini * as published by the Free Software Foundation; or, when distributed
11aa42aa13SStefano Stabellini * separately from the Linux kernel or incorporated into other
12aa42aa13SStefano Stabellini * software packages, subject to the following license:
13aa42aa13SStefano Stabellini *
14aa42aa13SStefano Stabellini * Permission is hereby granted, free of charge, to any person obtaining a copy
15aa42aa13SStefano Stabellini * of this source file (the "Software"), to deal in the Software without
16aa42aa13SStefano Stabellini * restriction, including without limitation the rights to use, copy, modify,
17aa42aa13SStefano Stabellini * merge, publish, distribute, sublicense, and/or sell copies of the Software,
18aa42aa13SStefano Stabellini * and to permit persons to whom the Software is furnished to do so, subject to
19aa42aa13SStefano Stabellini * the following conditions:
20aa42aa13SStefano Stabellini *
21aa42aa13SStefano Stabellini * The above copyright notice and this permission notice shall be included in
22aa42aa13SStefano Stabellini * all copies or substantial portions of the Software.
23aa42aa13SStefano Stabellini *
24aa42aa13SStefano Stabellini * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25aa42aa13SStefano Stabellini * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26aa42aa13SStefano Stabellini * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27aa42aa13SStefano Stabellini * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28aa42aa13SStefano Stabellini * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29aa42aa13SStefano Stabellini * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
30aa42aa13SStefano Stabellini * IN THE SOFTWARE.
31aa42aa13SStefano Stabellini */
32aa42aa13SStefano Stabellini
33aa42aa13SStefano Stabellini/*
34aa42aa13SStefano Stabellini * The Xen hypercall calling convention is very similar to the procedure
35aa42aa13SStefano Stabellini * call standard for the ARM 64-bit architecture: the first parameter is
36aa42aa13SStefano Stabellini * passed in x0, the second in x1, the third in x2, the fourth in x3 and
37aa42aa13SStefano Stabellini * the fifth in x4.
38aa42aa13SStefano Stabellini *
39aa42aa13SStefano Stabellini * The hypercall number is passed in x16.
40aa42aa13SStefano Stabellini *
41aa42aa13SStefano Stabellini * The return value is in x0.
42aa42aa13SStefano Stabellini *
43aa42aa13SStefano Stabellini * The hvc ISS is required to be 0xEA1, that is the Xen specific ARM
44aa42aa13SStefano Stabellini * hypercall tag.
45aa42aa13SStefano Stabellini *
46aa42aa13SStefano Stabellini * Parameter structs passed to hypercalls are laid out according to
47aa42aa13SStefano Stabellini * the ARM 64-bit EABI standard.
48aa42aa13SStefano Stabellini */
49aa42aa13SStefano Stabellini
50aa42aa13SStefano Stabellini#include <linux/linkage.h>
51aa42aa13SStefano Stabellini#include <asm/assembler.h>
52b4b8664dSAl Viro#include <asm/asm-uaccess.h>
53aa42aa13SStefano Stabellini#include <xen/interface/xen.h>
54aa42aa13SStefano Stabellini
55aa42aa13SStefano Stabellini
56aa42aa13SStefano Stabellini#define XEN_IMM 0xEA1
57aa42aa13SStefano Stabellini
58aa42aa13SStefano Stabellini#define HYPERCALL_SIMPLE(hypercall)		\
59*b6a5c582SMark BrownSYM_FUNC_START(HYPERVISOR_##hypercall)		\
60aa42aa13SStefano Stabellini	mov x16, #__HYPERVISOR_##hypercall;	\
61aa42aa13SStefano Stabellini	hvc XEN_IMM;				\
62aa42aa13SStefano Stabellini	ret;					\
63*b6a5c582SMark BrownSYM_FUNC_END(HYPERVISOR_##hypercall)
64aa42aa13SStefano Stabellini
65aa42aa13SStefano Stabellini#define HYPERCALL0 HYPERCALL_SIMPLE
66aa42aa13SStefano Stabellini#define HYPERCALL1 HYPERCALL_SIMPLE
67aa42aa13SStefano Stabellini#define HYPERCALL2 HYPERCALL_SIMPLE
68aa42aa13SStefano Stabellini#define HYPERCALL3 HYPERCALL_SIMPLE
69aa42aa13SStefano Stabellini#define HYPERCALL4 HYPERCALL_SIMPLE
70aa42aa13SStefano Stabellini#define HYPERCALL5 HYPERCALL_SIMPLE
71aa42aa13SStefano Stabellini
72aa42aa13SStefano Stabellini                .text
73aa42aa13SStefano Stabellini
74aa42aa13SStefano StabelliniHYPERCALL2(xen_version);
75aa42aa13SStefano StabelliniHYPERCALL3(console_io);
76aa42aa13SStefano StabelliniHYPERCALL3(grant_table_op);
77aa42aa13SStefano StabelliniHYPERCALL2(sched_op);
78aa42aa13SStefano StabelliniHYPERCALL2(event_channel_op);
79aa42aa13SStefano StabelliniHYPERCALL2(hvm_op);
80aa42aa13SStefano StabelliniHYPERCALL2(memory_op);
81aa42aa13SStefano StabelliniHYPERCALL2(physdev_op);
82aa42aa13SStefano StabelliniHYPERCALL3(vcpu_op);
8372d39c69SStefano StabelliniHYPERCALL1(platform_op_raw);
845e40704eSIan CampbellHYPERCALL2(multicall);
854b5ae015SJuergen GrossHYPERCALL2(vm_assist);
86ab520be8SPaul DurrantHYPERCALL3(dm_op);
87aa42aa13SStefano Stabellini
88*b6a5c582SMark BrownSYM_FUNC_START(privcmd_call)
89aa42aa13SStefano Stabellini	mov x16, x0
90aa42aa13SStefano Stabellini	mov x0, x1
91aa42aa13SStefano Stabellini	mov x1, x2
92aa42aa13SStefano Stabellini	mov x2, x3
93aa42aa13SStefano Stabellini	mov x3, x4
94aa42aa13SStefano Stabellini	mov x4, x5
959cf09d68SCatalin Marinas	/*
969cf09d68SCatalin Marinas	 * Privcmd calls are issued by the userspace. The kernel needs to
979cf09d68SCatalin Marinas	 * enable access to TTBR0_EL1 as the hypervisor would issue stage 1
989cf09d68SCatalin Marinas	 * translations to user memory via AT instructions. Since AT
999cf09d68SCatalin Marinas	 * instructions are not affected by the PAN bit (ARMv8.1), we only
1009cf09d68SCatalin Marinas	 * need the explicit uaccess_enable/disable if the TTBR0 PAN emulation
1019cf09d68SCatalin Marinas	 * is enabled (it implies that hardware UAO and PAN disabled).
1029cf09d68SCatalin Marinas	 */
10327a921e7SWill Deacon	uaccess_ttbr0_enable x6, x7, x8
104aa42aa13SStefano Stabellini	hvc XEN_IMM
1059cf09d68SCatalin Marinas
1069cf09d68SCatalin Marinas	/*
1079cf09d68SCatalin Marinas	 * Disable userspace access from kernel once the hyp call completed.
1089cf09d68SCatalin Marinas	 */
1096b88a32cSCatalin Marinas	uaccess_ttbr0_disable x6, x7
110aa42aa13SStefano Stabellini	ret
111*b6a5c582SMark BrownSYM_FUNC_END(privcmd_call);
112