]>
Commit | Line | Data |
---|---|---|
90aeb169 | 1 | /****************************************************************************** |
90aeb169 IY |
2 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> |
3 | * VA Linux Systems Japan K.K. | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License as published by | |
7 | * the Free Software Foundation; either version 2 of the License, or | |
8 | * (at your option) any later version. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, | |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | * GNU General Public License for more details. | |
14 | * | |
15 | * You should have received a copy of the GNU General Public License | |
16 | * along with this program; if not, write to the Free Software | |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | * | |
19 | */ | |
20 | ||
21 | ||
22 | #ifndef __ASM_PARAVIRT_H | |
23 | #define __ASM_PARAVIRT_H | |
24 | ||
dd97d5cb IY |
25 | #ifndef __ASSEMBLY__ |
26 | /****************************************************************************** | |
27 | * fsys related addresses | |
28 | */ | |
29 | struct pv_fsys_data { | |
30 | unsigned long *fsyscall_table; | |
31 | void *fsys_bubble_down; | |
32 | }; | |
33 | ||
34 | extern struct pv_fsys_data pv_fsys_data; | |
35 | ||
36 | unsigned long *paravirt_get_fsyscall_table(void); | |
37 | char *paravirt_get_fsys_bubble_down(void); | |
e4ff5b8f IY |
38 | |
39 | /****************************************************************************** | |
40 | * patchlist addresses for gate page | |
41 | */ | |
42 | enum pv_gate_patchlist { | |
43 | PV_GATE_START_FSYSCALL, | |
44 | PV_GATE_END_FSYSCALL, | |
45 | ||
46 | PV_GATE_START_BRL_FSYS_BUBBLE_DOWN, | |
47 | PV_GATE_END_BRL_FSYS_BUBBLE_DOWN, | |
48 | ||
49 | PV_GATE_START_VTOP, | |
50 | PV_GATE_END_VTOP, | |
51 | ||
52 | PV_GATE_START_MCKINLEY_E9, | |
53 | PV_GATE_END_MCKINLEY_E9, | |
54 | }; | |
55 | ||
56 | struct pv_patchdata { | |
57 | unsigned long start_fsyscall_patchlist; | |
58 | unsigned long end_fsyscall_patchlist; | |
59 | unsigned long start_brl_fsys_bubble_down_patchlist; | |
60 | unsigned long end_brl_fsys_bubble_down_patchlist; | |
61 | unsigned long start_vtop_patchlist; | |
62 | unsigned long end_vtop_patchlist; | |
63 | unsigned long start_mckinley_e9_patchlist; | |
64 | unsigned long end_mckinley_e9_patchlist; | |
65 | ||
66 | void *gate_section; | |
67 | }; | |
68 | ||
69 | extern struct pv_patchdata pv_patchdata; | |
70 | ||
71 | unsigned long paravirt_get_gate_patchlist(enum pv_gate_patchlist type); | |
72 | void *paravirt_get_gate_section(void); | |
dd97d5cb IY |
73 | #endif |
74 | ||
90aeb169 IY |
75 | #ifdef CONFIG_PARAVIRT_GUEST |
76 | ||
3e0879de IY |
77 | #define PARAVIRT_HYPERVISOR_TYPE_DEFAULT 0 |
78 | #define PARAVIRT_HYPERVISOR_TYPE_XEN 1 | |
79 | ||
90aeb169 IY |
80 | #ifndef __ASSEMBLY__ |
81 | ||
82 | #include <asm/hw_irq.h> | |
83 | #include <asm/meminit.h> | |
84 | ||
85 | /****************************************************************************** | |
86 | * general info | |
87 | */ | |
88 | struct pv_info { | |
89 | unsigned int kernel_rpl; | |
90 | int paravirt_enabled; | |
91 | const char *name; | |
92 | }; | |
93 | ||
94 | extern struct pv_info pv_info; | |
95 | ||
96 | static inline int paravirt_enabled(void) | |
97 | { | |
98 | return pv_info.paravirt_enabled; | |
99 | } | |
100 | ||
101 | static inline unsigned int get_kernel_rpl(void) | |
102 | { | |
103 | return pv_info.kernel_rpl; | |
104 | } | |
105 | ||
e51835d5 IY |
106 | /****************************************************************************** |
107 | * initialization hooks. | |
108 | */ | |
109 | struct rsvd_region; | |
110 | ||
111 | struct pv_init_ops { | |
112 | void (*banner)(void); | |
113 | ||
114 | int (*reserve_memory)(struct rsvd_region *region); | |
115 | ||
116 | void (*arch_setup_early)(void); | |
117 | void (*arch_setup_console)(char **cmdline_p); | |
118 | int (*arch_setup_nomca)(void); | |
119 | ||
120 | void (*post_smp_prepare_boot_cpu)(void); | |
03f511dd IY |
121 | |
122 | #ifdef ASM_SUPPORTED | |
123 | unsigned long (*patch_bundle)(void *sbundle, void *ebundle, | |
124 | unsigned long type); | |
125 | unsigned long (*patch_inst)(unsigned long stag, unsigned long etag, | |
126 | unsigned long type); | |
127 | #endif | |
128 | void (*patch_branch)(unsigned long tag, unsigned long type); | |
e51835d5 IY |
129 | }; |
130 | ||
131 | extern struct pv_init_ops pv_init_ops; | |
132 | ||
133 | static inline void paravirt_banner(void) | |
134 | { | |
135 | if (pv_init_ops.banner) | |
136 | pv_init_ops.banner(); | |
137 | } | |
138 | ||
139 | static inline int paravirt_reserve_memory(struct rsvd_region *region) | |
140 | { | |
141 | if (pv_init_ops.reserve_memory) | |
142 | return pv_init_ops.reserve_memory(region); | |
143 | return 0; | |
144 | } | |
145 | ||
146 | static inline void paravirt_arch_setup_early(void) | |
147 | { | |
148 | if (pv_init_ops.arch_setup_early) | |
149 | pv_init_ops.arch_setup_early(); | |
150 | } | |
151 | ||
152 | static inline void paravirt_arch_setup_console(char **cmdline_p) | |
153 | { | |
154 | if (pv_init_ops.arch_setup_console) | |
155 | pv_init_ops.arch_setup_console(cmdline_p); | |
156 | } | |
157 | ||
158 | static inline int paravirt_arch_setup_nomca(void) | |
159 | { | |
160 | if (pv_init_ops.arch_setup_nomca) | |
161 | return pv_init_ops.arch_setup_nomca(); | |
162 | return 0; | |
163 | } | |
164 | ||
165 | static inline void paravirt_post_smp_prepare_boot_cpu(void) | |
166 | { | |
167 | if (pv_init_ops.post_smp_prepare_boot_cpu) | |
168 | pv_init_ops.post_smp_prepare_boot_cpu(); | |
169 | } | |
170 | ||
33b39e84 IY |
171 | /****************************************************************************** |
172 | * replacement of iosapic operations. | |
173 | */ | |
174 | ||
175 | struct pv_iosapic_ops { | |
176 | void (*pcat_compat_init)(void); | |
177 | ||
ce1fc742 | 178 | struct irq_chip *(*__get_irq_chip)(unsigned long trigger); |
33b39e84 IY |
179 | |
180 | unsigned int (*__read)(char __iomem *iosapic, unsigned int reg); | |
181 | void (*__write)(char __iomem *iosapic, unsigned int reg, u32 val); | |
182 | }; | |
183 | ||
184 | extern struct pv_iosapic_ops pv_iosapic_ops; | |
185 | ||
186 | static inline void | |
187 | iosapic_pcat_compat_init(void) | |
188 | { | |
189 | if (pv_iosapic_ops.pcat_compat_init) | |
190 | pv_iosapic_ops.pcat_compat_init(); | |
191 | } | |
192 | ||
193 | static inline struct irq_chip* | |
194 | iosapic_get_irq_chip(unsigned long trigger) | |
195 | { | |
ce1fc742 | 196 | return pv_iosapic_ops.__get_irq_chip(trigger); |
33b39e84 IY |
197 | } |
198 | ||
199 | static inline unsigned int | |
200 | __iosapic_read(char __iomem *iosapic, unsigned int reg) | |
201 | { | |
202 | return pv_iosapic_ops.__read(iosapic, reg); | |
203 | } | |
204 | ||
205 | static inline void | |
206 | __iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val) | |
207 | { | |
208 | return pv_iosapic_ops.__write(iosapic, reg, val); | |
209 | } | |
210 | ||
85cbc503 IY |
211 | /****************************************************************************** |
212 | * replacement of irq operations. | |
213 | */ | |
214 | ||
215 | struct pv_irq_ops { | |
216 | void (*register_ipi)(void); | |
217 | ||
218 | int (*assign_irq_vector)(int irq); | |
219 | void (*free_irq_vector)(int vector); | |
220 | ||
221 | void (*register_percpu_irq)(ia64_vector vec, | |
222 | struct irqaction *action); | |
223 | ||
224 | void (*resend_irq)(unsigned int vector); | |
225 | }; | |
226 | ||
227 | extern struct pv_irq_ops pv_irq_ops; | |
228 | ||
229 | static inline void | |
230 | ia64_register_ipi(void) | |
231 | { | |
232 | pv_irq_ops.register_ipi(); | |
233 | } | |
234 | ||
235 | static inline int | |
236 | assign_irq_vector(int irq) | |
237 | { | |
238 | return pv_irq_ops.assign_irq_vector(irq); | |
239 | } | |
240 | ||
241 | static inline void | |
242 | free_irq_vector(int vector) | |
243 | { | |
244 | return pv_irq_ops.free_irq_vector(vector); | |
245 | } | |
246 | ||
247 | static inline void | |
248 | register_percpu_irq(ia64_vector vec, struct irqaction *action) | |
249 | { | |
250 | pv_irq_ops.register_percpu_irq(vec, action); | |
251 | } | |
252 | ||
253 | static inline void | |
254 | ia64_resend_irq(unsigned int vector) | |
255 | { | |
256 | pv_irq_ops.resend_irq(vector); | |
257 | } | |
258 | ||
00d21d82 IY |
259 | /****************************************************************************** |
260 | * replacement of time operations. | |
261 | */ | |
262 | ||
263 | extern struct itc_jitter_data_t itc_jitter_data; | |
264 | extern volatile int time_keeper_id; | |
265 | ||
266 | struct pv_time_ops { | |
267 | void (*init_missing_ticks_accounting)(int cpu); | |
268 | int (*do_steal_accounting)(unsigned long *new_itm); | |
269 | ||
270 | void (*clocksource_resume)(void); | |
f927da17 IY |
271 | |
272 | unsigned long long (*sched_clock)(void); | |
00d21d82 IY |
273 | }; |
274 | ||
275 | extern struct pv_time_ops pv_time_ops; | |
276 | ||
277 | static inline void | |
278 | paravirt_init_missing_ticks_accounting(int cpu) | |
279 | { | |
280 | if (pv_time_ops.init_missing_ticks_accounting) | |
281 | pv_time_ops.init_missing_ticks_accounting(cpu); | |
282 | } | |
283 | ||
c5905afb IM |
284 | struct static_key; |
285 | extern struct static_key paravirt_steal_enabled; | |
286 | extern struct static_key paravirt_steal_rq_enabled; | |
747f2925 | 287 | |
00d21d82 IY |
288 | static inline int |
289 | paravirt_do_steal_accounting(unsigned long *new_itm) | |
290 | { | |
291 | return pv_time_ops.do_steal_accounting(new_itm); | |
292 | } | |
293 | ||
f927da17 IY |
294 | static inline unsigned long long paravirt_sched_clock(void) |
295 | { | |
296 | return pv_time_ops.sched_clock(); | |
297 | } | |
298 | ||
90aeb169 IY |
299 | #endif /* !__ASSEMBLY__ */ |
300 | ||
301 | #else | |
302 | /* fallback for native case */ | |
303 | ||
e51835d5 IY |
304 | #ifndef __ASSEMBLY__ |
305 | ||
306 | #define paravirt_banner() do { } while (0) | |
307 | #define paravirt_reserve_memory(region) 0 | |
308 | ||
309 | #define paravirt_arch_setup_early() do { } while (0) | |
310 | #define paravirt_arch_setup_console(cmdline_p) do { } while (0) | |
311 | #define paravirt_arch_setup_nomca() 0 | |
312 | #define paravirt_post_smp_prepare_boot_cpu() do { } while (0) | |
313 | ||
00d21d82 IY |
314 | #define paravirt_init_missing_ticks_accounting(cpu) do { } while (0) |
315 | #define paravirt_do_steal_accounting(new_itm) 0 | |
316 | ||
e51835d5 IY |
317 | #endif /* __ASSEMBLY__ */ |
318 | ||
319 | ||
90aeb169 IY |
320 | #endif /* CONFIG_PARAVIRT_GUEST */ |
321 | ||
322 | #endif /* __ASM_PARAVIRT_H */ |