Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm64/xen/hypercall.S
26424 views
1
/******************************************************************************
2
* hypercall.S
3
*
4
* Xen hypercall wrappers
5
*
6
* Stefano Stabellini <[email protected]>, 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 procedure
35
* call standard for the ARM 64-bit architecture: the first parameter is
36
* passed in x0, the second in x1, the third in x2, the fourth in x3 and
37
* the fifth in x4.
38
*
39
* The hypercall number is passed in x16.
40
*
41
* The return value is in x0.
42
*
43
* The hvc ISS is required to be 0xEA1, that is the Xen specific ARM
44
* hypercall tag.
45
*
46
* Parameter structs passed to hypercalls are laid out according to
47
* the ARM 64-bit EABI standard.
48
*/
49
50
#include <linux/linkage.h>
51
#include <asm/assembler.h>
52
#include <asm/asm-uaccess.h>
53
#include <xen/interface/xen.h>
54
55
56
#define XEN_IMM 0xEA1
57
58
#define HYPERCALL_SIMPLE(hypercall) \
59
SYM_FUNC_START(HYPERVISOR_##hypercall) \
60
mov x16, #__HYPERVISOR_##hypercall; \
61
hvc XEN_IMM; \
62
ret; \
63
SYM_FUNC_END(HYPERVISOR_##hypercall)
64
65
#define HYPERCALL0 HYPERCALL_SIMPLE
66
#define HYPERCALL1 HYPERCALL_SIMPLE
67
#define HYPERCALL2 HYPERCALL_SIMPLE
68
#define HYPERCALL3 HYPERCALL_SIMPLE
69
#define HYPERCALL4 HYPERCALL_SIMPLE
70
#define HYPERCALL5 HYPERCALL_SIMPLE
71
72
.text
73
74
HYPERCALL2(xen_version);
75
HYPERCALL3(console_io);
76
HYPERCALL3(grant_table_op);
77
HYPERCALL2(sched_op);
78
HYPERCALL2(event_channel_op);
79
HYPERCALL2(hvm_op);
80
HYPERCALL2(memory_op);
81
HYPERCALL2(physdev_op);
82
HYPERCALL3(vcpu_op);
83
HYPERCALL1(platform_op_raw);
84
HYPERCALL2(multicall);
85
HYPERCALL2(vm_assist);
86
87
SYM_FUNC_START(HYPERVISOR_dm_op)
88
mov x16, #__HYPERVISOR_dm_op; \
89
/*
90
* dm_op hypercalls are issued by the userspace. The kernel needs to
91
* enable access to TTBR0_EL1 as the hypervisor would issue stage 1
92
* translations to user memory via AT instructions. Since AT
93
* instructions are not affected by the PAN bit (ARMv8.1), we only
94
* need the explicit uaccess_enable/disable if the TTBR0 PAN emulation
95
* is enabled (it implies that hardware UAO and PAN disabled).
96
*/
97
uaccess_ttbr0_enable x6, x7, x8
98
hvc XEN_IMM
99
100
/*
101
* Disable userspace access from kernel once the hyp call completed.
102
*/
103
uaccess_ttbr0_disable x6, x7
104
ret
105
SYM_FUNC_END(HYPERVISOR_dm_op);
106
107
SYM_FUNC_START(privcmd_call)
108
mov x16, x0
109
mov x0, x1
110
mov x1, x2
111
mov x2, x3
112
mov x3, x4
113
mov x4, x5
114
/*
115
* Privcmd calls are issued by the userspace. The kernel needs to
116
* enable access to TTBR0_EL1 as the hypervisor would issue stage 1
117
* translations to user memory via AT instructions. Since AT
118
* instructions are not affected by the PAN bit (ARMv8.1), we only
119
* need the explicit uaccess_enable/disable if the TTBR0 PAN emulation
120
* is enabled (it implies that hardware UAO and PAN disabled).
121
*/
122
uaccess_ttbr0_enable x6, x7, x8
123
hvc XEN_IMM
124
125
/*
126
* Disable userspace access from kernel once the hyp call completed.
127
*/
128
uaccess_ttbr0_disable x6, x7
129
ret
130
SYM_FUNC_END(privcmd_call);
131
132