xen.h revision 1.8.2.4 1 1.8.2.4 skrll /* $NetBSD: xen.h,v 1.8.2.4 2004/09/21 13:24:37 skrll Exp $ */
2 1.8.2.2 skrll
3 1.8.2.2 skrll /*
4 1.8.2.2 skrll *
5 1.8.2.2 skrll * Copyright (c) 2003, 2004 Keir Fraser (on behalf of the Xen team)
6 1.8.2.2 skrll * All rights reserved.
7 1.8.2.2 skrll *
8 1.8.2.2 skrll * Permission is hereby granted, free of charge, to any person obtaining a copy
9 1.8.2.2 skrll * of this software and associated documentation files (the "Software"), to
10 1.8.2.2 skrll * deal in the Software without restriction, including without limitation the
11 1.8.2.2 skrll * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
12 1.8.2.2 skrll * sell copies of the Software, and to permit persons to whom the Software is
13 1.8.2.2 skrll * furnished to do so, subject to the following conditions:
14 1.8.2.2 skrll *
15 1.8.2.2 skrll * The above copyright notice and this permission notice shall be included in
16 1.8.2.2 skrll * all copies or substantial portions of the Software.
17 1.8.2.2 skrll *
18 1.8.2.2 skrll * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 1.8.2.2 skrll * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 1.8.2.2 skrll * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 1.8.2.2 skrll * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 1.8.2.2 skrll * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 1.8.2.2 skrll * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 1.8.2.2 skrll * DEALINGS IN THE SOFTWARE.
25 1.8.2.2 skrll */
26 1.8.2.2 skrll
27 1.8.2.2 skrll
28 1.8.2.2 skrll #ifndef _XEN_H
29 1.8.2.2 skrll #define _XEN_H
30 1.8.2.2 skrll
31 1.8.2.2 skrll #ifndef _LOCORE
32 1.8.2.2 skrll
33 1.8.2.2 skrll struct xen_netinfo {
34 1.8.2.2 skrll uint32_t xi_ifno;
35 1.8.2.2 skrll char *xi_root;
36 1.8.2.2 skrll uint32_t xi_ip[5];
37 1.8.2.2 skrll };
38 1.8.2.2 skrll
39 1.8.2.2 skrll union xen_cmdline_parseinfo {
40 1.8.2.2 skrll char xcp_bootdev[16]; /* sizeof(dv_xname) */
41 1.8.2.2 skrll struct xen_netinfo xcp_netinfo;
42 1.8.2.2 skrll char xcp_console[16];
43 1.8.2.2 skrll };
44 1.8.2.2 skrll
45 1.8.2.2 skrll #define XEN_PARSE_BOOTDEV 0
46 1.8.2.2 skrll #define XEN_PARSE_NETINFO 1
47 1.8.2.2 skrll #define XEN_PARSE_CONSOLE 2
48 1.8.2.2 skrll
49 1.8.2.2 skrll void xen_parse_cmdline(int, union xen_cmdline_parseinfo *);
50 1.8.2.2 skrll
51 1.8.2.2 skrll void xenconscn_attach(void);
52 1.8.2.2 skrll
53 1.8.2.2 skrll void xenmachmem_init(void);
54 1.8.2.2 skrll void xenprivcmd_init(void);
55 1.8.2.2 skrll void xenvfr_init(void);
56 1.8.2.2 skrll
57 1.8.2.2 skrll #ifdef XENDEBUG
58 1.8.2.2 skrll void printk(const char *, ...);
59 1.8.2.2 skrll void vprintk(const char *, va_list);
60 1.8.2.2 skrll #endif
61 1.8.2.2 skrll
62 1.8.2.2 skrll #endif
63 1.8.2.2 skrll
64 1.8.2.2 skrll #define hypervisor_asm_ack(num) \
65 1.8.2.2 skrll movl HYPERVISOR_shared_info,%eax ;\
66 1.8.2.2 skrll lock ;\
67 1.8.2.2 skrll btsl $num,EVENTS_MASK(%eax)
68 1.8.2.2 skrll
69 1.8.2.2 skrll #endif /* _XEN_H */
70 1.8.2.2 skrll
71 1.8.2.2 skrll /******************************************************************************
72 1.8.2.2 skrll * os.h
73 1.8.2.2 skrll *
74 1.8.2.2 skrll * random collection of macros and definition
75 1.8.2.2 skrll */
76 1.8.2.2 skrll
77 1.8.2.2 skrll #ifndef _OS_H_
78 1.8.2.2 skrll #define _OS_H_
79 1.8.2.2 skrll
80 1.8.2.2 skrll /*
81 1.8.2.2 skrll * These are the segment descriptors provided for us by the hypervisor.
82 1.8.2.2 skrll * For now, these are hardwired -- guest OSes cannot update the GDT
83 1.8.2.2 skrll * or LDT.
84 1.8.2.2 skrll *
85 1.8.2.2 skrll * It shouldn't be hard to support descriptor-table frobbing -- let me
86 1.8.2.2 skrll * know if the BSD or XP ports require flexibility here.
87 1.8.2.2 skrll */
88 1.8.2.2 skrll
89 1.8.2.2 skrll
90 1.8.2.2 skrll /*
91 1.8.2.2 skrll * these are also defined in hypervisor-if.h but can't be pulled in as
92 1.8.2.2 skrll * they are used in start of day assembly. Need to clean up the .h files
93 1.8.2.2 skrll * a bit more...
94 1.8.2.2 skrll */
95 1.8.2.2 skrll
96 1.8.2.2 skrll #ifndef FLAT_RING1_CS
97 1.8.2.2 skrll #define FLAT_RING1_CS 0x0819
98 1.8.2.2 skrll #define FLAT_RING1_DS 0x0821
99 1.8.2.2 skrll #define FLAT_RING3_CS 0x082b
100 1.8.2.2 skrll #define FLAT_RING3_DS 0x0833
101 1.8.2.2 skrll #endif
102 1.8.2.2 skrll
103 1.8.2.2 skrll #define __KERNEL_CS FLAT_RING1_CS
104 1.8.2.2 skrll #define __KERNEL_DS FLAT_RING1_DS
105 1.8.2.2 skrll
106 1.8.2.2 skrll /* Everything below this point is not included by assembler (.S) files. */
107 1.8.2.2 skrll #ifndef _LOCORE
108 1.8.2.2 skrll
109 1.8.2.2 skrll /* some function prototypes */
110 1.8.2.2 skrll void trap_init(void);
111 1.8.2.2 skrll
112 1.8.2.2 skrll
113 1.8.2.2 skrll /*
114 1.8.2.2 skrll * STI/CLI equivalents. These basically set and clear the virtual
115 1.8.2.2 skrll * event_enable flag in teh shared_info structure. Note that when
116 1.8.2.2 skrll * the enable bit is set, there may be pending events to be handled.
117 1.8.2.2 skrll * We may therefore call into do_hypervisor_callback() directly.
118 1.8.2.2 skrll */
119 1.8.2.2 skrll
120 1.8.2.2 skrll #define __save_flags(x) \
121 1.8.2.2 skrll do { \
122 1.8.2.2 skrll (x) = x86_atomic_test_bit(&HYPERVISOR_shared_info->events_mask, \
123 1.8.2.2 skrll EVENTS_MASTER_ENABLE_BIT); \
124 1.8.2.2 skrll __insn_barrier(); \
125 1.8.2.2 skrll } while (0)
126 1.8.2.2 skrll
127 1.8.2.2 skrll #define __restore_flags(x) \
128 1.8.2.2 skrll do { \
129 1.8.2.2 skrll shared_info_t *_shared = HYPERVISOR_shared_info; \
130 1.8.2.2 skrll if (x) x86_atomic_set_bit(&_shared->events_mask, \
131 1.8.2.2 skrll EVENTS_MASTER_ENABLE_BIT); \
132 1.8.2.2 skrll __insn_barrier(); \
133 1.8.2.2 skrll } while (0)
134 1.8.2.2 skrll /* if (__predict_false(_shared->events) && (x)) do_hypervisor_callback(NULL); \ */
135 1.8.2.2 skrll
136 1.8.2.2 skrll #define __cli() \
137 1.8.2.2 skrll do { \
138 1.8.2.2 skrll x86_atomic_clear_bit(&HYPERVISOR_shared_info->events_mask, \
139 1.8.2.2 skrll EVENTS_MASTER_ENABLE_BIT); \
140 1.8.2.2 skrll __insn_barrier(); \
141 1.8.2.2 skrll } while (0)
142 1.8.2.2 skrll
143 1.8.2.2 skrll #define __sti() \
144 1.8.2.2 skrll do { \
145 1.8.2.2 skrll shared_info_t *_shared = HYPERVISOR_shared_info; \
146 1.8.2.2 skrll x86_atomic_set_bit(&_shared->events_mask, \
147 1.8.2.2 skrll EVENTS_MASTER_ENABLE_BIT); \
148 1.8.2.2 skrll __insn_barrier(); \
149 1.8.2.2 skrll } while (0)
150 1.8.2.2 skrll /* if (__predict_false(_shared->events)) do_hypervisor_callback(NULL); \ */
151 1.8.2.2 skrll
152 1.8.2.2 skrll #define cli() __cli()
153 1.8.2.2 skrll #define sti() __sti()
154 1.8.2.2 skrll #define save_flags(x) __save_flags(x)
155 1.8.2.2 skrll #define restore_flags(x) __restore_flags(x)
156 1.8.2.2 skrll #define save_and_cli(x) __save_and_cli(x)
157 1.8.2.2 skrll #define save_and_sti(x) __save_and_sti(x)
158 1.8.2.2 skrll
159 1.8.2.2 skrll #ifdef MULTIPROCESSOR
160 1.8.2.2 skrll #define __LOCK_PREFIX "lock; "
161 1.8.2.2 skrll #else
162 1.8.2.2 skrll #define __LOCK_PREFIX ""
163 1.8.2.2 skrll #endif
164 1.8.2.2 skrll
165 1.8.2.2 skrll static __inline__ unsigned long
166 1.8.2.2 skrll x86_atomic_xchg(unsigned long *ptr, unsigned long val)
167 1.8.2.2 skrll {
168 1.8.2.2 skrll unsigned long result;
169 1.8.2.2 skrll
170 1.8.2.2 skrll __asm __volatile("xchgl %0,%1"
171 1.8.2.2 skrll :"=r" (result)
172 1.8.2.2 skrll :"m" (*ptr), "0" (val)
173 1.8.2.2 skrll :"memory");
174 1.8.2.2 skrll
175 1.8.2.2 skrll return result;
176 1.8.2.2 skrll }
177 1.8.2.2 skrll
178 1.8.2.2 skrll static __inline__ int
179 1.8.2.2 skrll x86_atomic_test_and_clear_bit(volatile void *ptr, int bitno)
180 1.8.2.2 skrll {
181 1.8.2.2 skrll int result;
182 1.8.2.2 skrll
183 1.8.2.2 skrll __asm __volatile(__LOCK_PREFIX
184 1.8.2.2 skrll "btrl %2,%1 ;"
185 1.8.2.2 skrll "sbbl %0,%0"
186 1.8.2.2 skrll :"=r" (result), "=m" (*(volatile uint32_t *)(ptr))
187 1.8.2.2 skrll :"Ir" (bitno) : "memory");
188 1.8.2.2 skrll return result;
189 1.8.2.2 skrll }
190 1.8.2.2 skrll
191 1.8.2.2 skrll static __inline int
192 1.8.2.2 skrll x86_constant_test_bit(const volatile void *ptr, int bitno)
193 1.8.2.2 skrll {
194 1.8.2.2 skrll return ((1UL << (bitno & 31)) &
195 1.8.2.2 skrll (((const volatile uint32_t *) ptr)[bitno >> 5])) != 0;
196 1.8.2.2 skrll }
197 1.8.2.2 skrll
198 1.8.2.2 skrll static __inline int
199 1.8.2.2 skrll x86_variable_test_bit(const volatile void *ptr, int bitno)
200 1.8.2.2 skrll {
201 1.8.2.2 skrll int result;
202 1.8.2.2 skrll
203 1.8.2.2 skrll __asm __volatile(
204 1.8.2.2 skrll "btl %2,%1 ;"
205 1.8.2.2 skrll "sbbl %0,%0"
206 1.8.2.2 skrll :"=r" (result)
207 1.8.2.2 skrll :"m" (*(volatile uint32_t *)(ptr)), "Ir" (bitno));
208 1.8.2.2 skrll return result;
209 1.8.2.2 skrll }
210 1.8.2.2 skrll
211 1.8.2.2 skrll #define x86_atomic_test_bit(ptr, bitno) \
212 1.8.2.2 skrll (__builtin_constant_p(bitno) ? \
213 1.8.2.2 skrll x86_constant_test_bit((ptr),(bitno)) : \
214 1.8.2.2 skrll variable_test_bit((ptr),(bitno)))
215 1.8.2.2 skrll
216 1.8.2.2 skrll static __inline void
217 1.8.2.2 skrll x86_atomic_set_bit(volatile void *ptr, int bitno)
218 1.8.2.2 skrll {
219 1.8.2.2 skrll __asm __volatile(__LOCK_PREFIX
220 1.8.2.2 skrll "btsl %1,%0"
221 1.8.2.2 skrll :"=m" (*(volatile uint32_t *)(ptr))
222 1.8.2.2 skrll :"Ir" (bitno));
223 1.8.2.2 skrll }
224 1.8.2.2 skrll
225 1.8.2.2 skrll static __inline void
226 1.8.2.2 skrll x86_atomic_clear_bit(volatile void *ptr, int bitno)
227 1.8.2.2 skrll {
228 1.8.2.2 skrll __asm __volatile(__LOCK_PREFIX
229 1.8.2.2 skrll "btrl %1,%0"
230 1.8.2.2 skrll :"=m" (*(volatile uint32_t *)(ptr))
231 1.8.2.2 skrll :"Ir" (bitno));
232 1.8.2.2 skrll }
233 1.8.2.2 skrll
234 1.8.2.2 skrll #endif /* !__ASSEMBLY__ */
235 1.8.2.2 skrll
236 1.8.2.2 skrll #endif /* _OS_H_ */
237