source: mainline/kernel/arch/xen32/include/hypercall.h@ 7d3d641

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 7d3d641 was 7d3d641, checked in by Martin Decky <martin@…>, 19 years ago

xen32: initialize virtual IDT

  • Property mode set to 100644
File size: 5.7 KB
Line 
1/*
2 * Copyright (C) 2006 Martin Decky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef __xen32_HYPERCALL_H__
30#define __xen32_HYPERCALL_H__
31
32#include <arch/types.h>
33#include <macros.h>
34
35
36typedef uint16_t domid_t;
37
38
39typedef struct {
40 uint8_t vector; /**< Exception vector */
41 uint8_t flags; /**< 0-3: privilege level; 4: clear event enable */
42 uint16_t cs; /**< Code selector */
43 uintptr_t address; /**< Code offset */
44} trap_info_t;
45
46
47#define XEN_SET_TRAP_TABLE 0
48#define XEN_MMU_UPDATE 1
49#define XEN_SET_CALLBACKS 4
50#define XEN_UPDATE_VA_MAPPING 14
51#define XEN_CONSOLE_IO 18
52#define XEN_VM_ASSIST 21
53#define XEN_MMUEXT_OP 26
54
55
56/*
57 * Commands for XEN_CONSOLE_IO
58 */
59#define CONSOLE_IO_WRITE 0
60#define CONSOLE_IO_READ 1
61
62
63#define MMUEXT_PIN_L1_TABLE 0
64#define MMUEXT_PIN_L2_TABLE 1
65#define MMUEXT_PIN_L3_TABLE 2
66#define MMUEXT_PIN_L4_TABLE 3
67#define MMUEXT_UNPIN_TABLE 4
68#define MMUEXT_NEW_BASEPTR 5
69#define MMUEXT_TLB_FLUSH_LOCAL 6
70#define MMUEXT_INVLPG_LOCAL 7
71#define MMUEXT_TLB_FLUSH_MULTI 8
72#define MMUEXT_INVLPG_MULTI 9
73#define MMUEXT_TLB_FLUSH_ALL 10
74#define MMUEXT_INVLPG_ALL 11
75#define MMUEXT_FLUSH_CACHE 12
76#define MMUEXT_SET_LDT 13
77#define MMUEXT_NEW_USER_BASEPTR 15
78
79
80#define UVMF_NONE 0 /**< No flushing at all */
81#define UVMF_TLB_FLUSH 1 /**< Flush entire TLB(s) */
82#define UVMF_INVLPG 2 /**< Flush only one entry */
83#define UVMF_FLUSHTYPE_MASK 3
84#define UVMF_MULTI 0 /**< Flush subset of TLBs */
85#define UVMF_LOCAL 0 /**< Flush local TLB */
86#define UVMF_ALL (1 << 2) /**< Flush all TLBs */
87
88
89/*
90 * Commands to XEN_VM_ASSIST
91 */
92#define VMASST_CMD_ENABLE 0
93#define VMASST_CMD_DISABLE 1
94#define VMASST_TYPE_4GB_SEGMENTS 0
95#define VMASST_TYPE_4GB_SEGMENTS_NOTIFY 1
96#define VMASST_TYPE_WRITABLE_PAGETABLES 2
97
98
99#define DOMID_SELF (0x7FF0U)
100#define DOMID_IO (0x7FF1U)
101
102
103#define hypercall0(id) \
104 ({ \
105 unative_t ret; \
106 asm volatile ( \
107 "call hypercall_page + (" STRING(id) " * 32)\n" \
108 : "=a" (ret) \
109 : \
110 : "memory" \
111 ); \
112 ret; \
113 })
114
115#define hypercall1(id, p1) \
116 ({ \
117 unative_t ret, __ign1; \
118 asm volatile ( \
119 "call hypercall_page + (" STRING(id) " * 32)\n" \
120 : "=a" (ret), \
121 "=b" (__ign1) \
122 : "1" (p1) \
123 : "memory" \
124 ); \
125 ret; \
126 })
127
128#define hypercall2(id, p1, p2) \
129 ({ \
130 unative_t ret, __ign1, __ign2; \
131 asm volatile ( \
132 "call hypercall_page + (" STRING(id) " * 32)\n" \
133 : "=a" (ret), \
134 "=b" (__ign1), \
135 "=c" (__ign2) \
136 : "1" (p1), \
137 "2" (p2) \
138 : "memory" \
139 ); \
140 ret; \
141 })
142
143#define hypercall3(id, p1, p2, p3) \
144 ({ \
145 unative_t ret, __ign1, __ign2, __ign3; \
146 asm volatile ( \
147 "call hypercall_page + (" STRING(id) " * 32)\n" \
148 : "=a" (ret), \
149 "=b" (__ign1), \
150 "=c" (__ign2), \
151 "=d" (__ign3) \
152 : "1" (p1), \
153 "2" (p2), \
154 "3" (p3) \
155 : "memory" \
156 ); \
157 ret; \
158 })
159
160#define hypercall4(id, p1, p2, p3, p4) \
161 ({ \
162 unative_t ret, __ign1, __ign2, __ign3, __ign4; \
163 asm volatile ( \
164 "call hypercall_page + (" STRING(id) " * 32)\n" \
165 : "=a" (ret), \
166 "=b" (__ign1), \
167 "=c" (__ign2), \
168 "=d" (__ign3), \
169 "=S" (__ign4) \
170 : "1" (p1), \
171 "2" (p2), \
172 "3" (p3), \
173 "4" (p4) \
174 : "memory" \
175 ); \
176 ret; \
177 })
178
179#define hypercall5(id, p1, p2, p3, p4, p5) \
180 ({ \
181 unative_t ret, __ign1, __ign2, __ign3, __ign4, __ign5; \
182 asm volatile ( \
183 "call hypercall_page + (" STRING(id) " * 32)\n" \
184 : "=a" (ret), \
185 "=b" (__ign1), \
186 "=c" (__ign2), \
187 "=d" (__ign3), \
188 "=S" (__ign4), \
189 "=D" (__ign5) \
190 : "1" (p1), \
191 "2" (p2), \
192 "3" (p3), \
193 "4" (p4), \
194 "5" (p5) \
195 : "memory" \
196 ); \
197 ret; \
198 })
199
200
201static inline int xen_console_io(const unsigned int cmd, const unsigned int count, const char *str)
202{
203 return hypercall3(XEN_CONSOLE_IO, cmd, count, str);
204}
205
206static inline int xen_vm_assist(const unsigned int cmd, const unsigned int type)
207{
208 return hypercall2(XEN_VM_ASSIST, cmd, type);
209}
210
211static inline int xen_set_callbacks(const unsigned int event_selector, const void *event_address, const unsigned int failsafe_selector, void *failsafe_address)
212{
213 return hypercall4(XEN_SET_CALLBACKS, event_selector, event_address, failsafe_selector, failsafe_address);
214}
215
216static inline int xen_set_trap_table(const trap_info_t *table)
217{
218 return hypercall1(XEN_SET_TRAP_TABLE, table);
219}
220
221#endif
Note: See TracBrowser for help on using the repository browser.