Blame view

arch/x86/kernel/paravirt.c 11.9 KB
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /*  Paravirtualization interfaces
      Copyright (C) 2006 Rusty Russell IBM Corporation
  
      This program is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published by
      the Free Software Foundation; either version 2 of the License, or
      (at your option) any later version.
  
      This program is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      GNU General Public License for more details.
  
      You should have received a copy of the GNU General Public License
      along with this program; if not, write to the Free Software
      Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
b1df07bd6   Glauber de Oliveira Costa   x86: change parav...
17
18
  
      2007 - x86_64 support added by Glauber de Oliveira Costa, Red Hat Inc
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
19
  */
b1df07bd6   Glauber de Oliveira Costa   x86: change parav...
20

d3561b7fa   Rusty Russell   [PATCH] paravirt:...
21
22
23
24
  #include <linux/errno.h>
  #include <linux/module.h>
  #include <linux/efi.h>
  #include <linux/bcd.h>
ce6234b52   Jeremy Fitzhardinge   [PATCH] i386: PAR...
25
  #include <linux/highmem.h>
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
26
27
28
29
30
  
  #include <asm/bug.h>
  #include <asm/paravirt.h>
  #include <asm/desc.h>
  #include <asm/setup.h>
a312b37b2   Eduardo Habkost   x86/paravirt: cal...
31
  #include <asm/pgtable.h>
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
32
  #include <asm/time.h>
eba0045ff   Jeremy Fitzhardinge   x86/paravirt: add...
33
  #include <asm/pgalloc.h>
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
34
35
  #include <asm/irq.h>
  #include <asm/delay.h>
13623d793   Rusty Russell   [PATCH] paravirt:...
36
37
  #include <asm/fixmap.h>
  #include <asm/apic.h>
da181a8b3   Rusty Russell   [PATCH] paravirt:...
38
  #include <asm/tlbflush.h>
6cb9a8350   Zachary Amsden   [PATCH] vmi: sche...
39
  #include <asm/timer.h>
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
40
41
  
  /* nop stub */
458762336   Jeremy Fitzhardinge   [PATCH] i386: PAR...
42
  void _paravirt_nop(void)
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
43
44
  {
  }
41edafdb7   Jeremy Fitzhardinge   x86/pvops: add a ...
45
46
47
48
49
50
51
52
53
54
  /* identity function, which can be inlined */
  u32 _paravirt_ident_32(u32 x)
  {
  	return x;
  }
  
  u64 _paravirt_ident_64(u64 x)
  {
  	return x;
  }
6f30c1ac3   Thomas Gleixner   x86: Move paravir...
55
  void __init default_banner(void)
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
56
57
58
  {
  	printk(KERN_INFO "Booting paravirtualized kernel on %s
  ",
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
59
  	       pv_info.name);
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
60
  }
139ec7c41   Rusty Russell   [PATCH] paravirt:...
61
  /* Simple instruction patching code. */
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
62
63
64
  #define DEF_NATIVE(ops, name, code)					\
  	extern const char start_##ops##_##name[], end_##ops##_##name[];	\
  	asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":")
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
65
66
  /* Undefined instruction for dealing with missing ops pointers. */
  static const unsigned char ud2a[] = { 0x0f, 0x0b };
139ec7c41   Rusty Russell   [PATCH] paravirt:...
67

63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
68
69
70
71
72
73
74
75
76
  unsigned paravirt_patch_nop(void)
  {
  	return 0;
  }
  
  unsigned paravirt_patch_ignore(unsigned len)
  {
  	return len;
  }
19d36ccdc   Andi Kleen   x86: Fix alternat...
77
78
79
80
  struct branch {
  	unsigned char opcode;
  	u32 delta;
  } __attribute__((packed));
ab144f5ec   Andi Kleen   i386: Make patchi...
81
82
83
  unsigned paravirt_patch_call(void *insnbuf,
  			     const void *target, u16 tgt_clobbers,
  			     unsigned long addr, u16 site_clobbers,
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
84
85
  			     unsigned len)
  {
ab144f5ec   Andi Kleen   i386: Make patchi...
86
87
  	struct branch *b = insnbuf;
  	unsigned long delta = (unsigned long)target - (addr+5);
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
88
89
90
91
92
  
  	if (tgt_clobbers & ~site_clobbers)
  		return len;	/* target would clobber too much for this site */
  	if (len < 5)
  		return len;	/* call too long for patch site */
139ec7c41   Rusty Russell   [PATCH] paravirt:...
93

ab144f5ec   Andi Kleen   i386: Make patchi...
94
95
96
  	b->opcode = 0xe8; /* call */
  	b->delta = delta;
  	BUILD_BUG_ON(sizeof(*b) != 5);
139ec7c41   Rusty Russell   [PATCH] paravirt:...
97

63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
98
99
  	return 5;
  }
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
100
  unsigned paravirt_patch_jmp(void *insnbuf, const void *target,
ab144f5ec   Andi Kleen   i386: Make patchi...
101
  			    unsigned long addr, unsigned len)
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
102
  {
ab144f5ec   Andi Kleen   i386: Make patchi...
103
104
  	struct branch *b = insnbuf;
  	unsigned long delta = (unsigned long)target - (addr+5);
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
105
106
107
  
  	if (len < 5)
  		return len;	/* call too long for patch site */
ab144f5ec   Andi Kleen   i386: Make patchi...
108
109
  	b->opcode = 0xe9;	/* jmp */
  	b->delta = delta;
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
110
111
112
  
  	return 5;
  }
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
113
114
115
116
117
118
  /* Neat trick to map patch type back to the call within the
   * corresponding structure. */
  static void *get_call_destination(u8 type)
  {
  	struct paravirt_patch_template tmpl = {
  		.pv_init_ops = pv_init_ops,
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
119
120
121
122
123
  		.pv_time_ops = pv_time_ops,
  		.pv_cpu_ops = pv_cpu_ops,
  		.pv_irq_ops = pv_irq_ops,
  		.pv_apic_ops = pv_apic_ops,
  		.pv_mmu_ops = pv_mmu_ops,
b4ecc1269   Jeremy Fitzhardinge   x86: Fix performa...
124
  #ifdef CONFIG_PARAVIRT_SPINLOCKS
74d4affde   Jeremy Fitzhardinge   x86/paravirt: add...
125
  		.pv_lock_ops = pv_lock_ops,
b4ecc1269   Jeremy Fitzhardinge   x86: Fix performa...
126
  #endif
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
127
128
129
  	};
  	return *((void **)&tmpl + type);
  }
ab144f5ec   Andi Kleen   i386: Make patchi...
130
131
  unsigned paravirt_patch_default(u8 type, u16 clobbers, void *insnbuf,
  				unsigned long addr, unsigned len)
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
132
  {
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
133
  	void *opfunc = get_call_destination(type);
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
134
135
136
137
  	unsigned ret;
  
  	if (opfunc == NULL)
  		/* If there's no function, patch it with a ud2a (BUG) */
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
138
  		ret = paravirt_patch_insns(insnbuf, len, ud2a, ud2a+sizeof(ud2a));
41edafdb7   Jeremy Fitzhardinge   x86/pvops: add a ...
139
  	else if (opfunc == _paravirt_nop)
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
140
141
  		/* If the operation is a nop, then nop the callsite */
  		ret = paravirt_patch_nop();
41edafdb7   Jeremy Fitzhardinge   x86/pvops: add a ...
142
143
144
145
146
147
  
  	/* identity functions just return their single argument */
  	else if (opfunc == _paravirt_ident_32)
  		ret = paravirt_patch_ident_32(insnbuf, len);
  	else if (opfunc == _paravirt_ident_64)
  		ret = paravirt_patch_ident_64(insnbuf, len);
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
148
  	else if (type == PARAVIRT_PATCH(pv_cpu_ops.iret) ||
d75cd22fd   Jeremy Fitzhardinge   x86/paravirt: spl...
149
  		 type == PARAVIRT_PATCH(pv_cpu_ops.irq_enable_sysexit) ||
2be29982a   Jeremy Fitzhardinge   x86/paravirt: add...
150
151
  		 type == PARAVIRT_PATCH(pv_cpu_ops.usergs_sysret32) ||
  		 type == PARAVIRT_PATCH(pv_cpu_ops.usergs_sysret64))
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
152
  		/* If operation requires a jmp, then jmp */
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
153
  		ret = paravirt_patch_jmp(insnbuf, opfunc, addr, len);
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
154
155
156
  	else
  		/* Otherwise call the function; assume target could
  		   clobber any caller-save reg */
ab144f5ec   Andi Kleen   i386: Make patchi...
157
158
  		ret = paravirt_patch_call(insnbuf, opfunc, CLBR_ANY,
  					  addr, clobbers, len);
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
159
160
161
  
  	return ret;
  }
ab144f5ec   Andi Kleen   i386: Make patchi...
162
  unsigned paravirt_patch_insns(void *insnbuf, unsigned len,
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
163
164
165
  			      const char *start, const char *end)
  {
  	unsigned insn_len = end - start;
139ec7c41   Rusty Russell   [PATCH] paravirt:...
166

63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
167
168
169
  	if (insn_len > len || start == NULL)
  		insn_len = len;
  	else
ab144f5ec   Andi Kleen   i386: Make patchi...
170
  		memcpy(insnbuf, start, insn_len);
139ec7c41   Rusty Russell   [PATCH] paravirt:...
171

139ec7c41   Rusty Russell   [PATCH] paravirt:...
172
173
  	return insn_len;
  }
1a1eecd1c   Andi Kleen   [PATCH] i386: Rem...
174
  static void native_flush_tlb(void)
da181a8b3   Rusty Russell   [PATCH] paravirt:...
175
176
177
178
179
180
181
182
  {
  	__native_flush_tlb();
  }
  
  /*
   * Global pages have to be flushed a bit differently. Not a real
   * performance problem because this does not happen often.
   */
1a1eecd1c   Andi Kleen   [PATCH] i386: Rem...
183
  static void native_flush_tlb_global(void)
da181a8b3   Rusty Russell   [PATCH] paravirt:...
184
185
186
  {
  	__native_flush_tlb_global();
  }
63f70270c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
187
  static void native_flush_tlb_single(unsigned long addr)
da181a8b3   Rusty Russell   [PATCH] paravirt:...
188
189
190
  {
  	__native_flush_tlb_single(addr);
  }
3c404b578   Glauber Costa   KVM guest: Add a ...
191
192
193
194
195
196
197
  struct jump_label_key paravirt_steal_enabled;
  struct jump_label_key paravirt_steal_rq_enabled;
  
  static u64 native_steal_clock(int cpu)
  {
  	return 0;
  }
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
198
  /* These are in entry.S */
1a1eecd1c   Andi Kleen   [PATCH] i386: Rem...
199
  extern void native_iret(void);
d75cd22fd   Jeremy Fitzhardinge   x86/paravirt: spl...
200
  extern void native_irq_enable_sysexit(void);
2be29982a   Jeremy Fitzhardinge   x86/paravirt: add...
201
202
  extern void native_usergs_sysret32(void);
  extern void native_usergs_sysret64(void);
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
203

d572929cd   Jeremy Fitzhardinge   paravirt: helper ...
204
205
206
207
208
209
  static struct resource reserve_ioports = {
  	.start = 0,
  	.end = IO_SPACE_LIMIT,
  	.name = "paravirt-ioport",
  	.flags = IORESOURCE_IO | IORESOURCE_BUSY,
  };
d572929cd   Jeremy Fitzhardinge   paravirt: helper ...
210
211
212
213
214
215
216
217
218
  /*
   * Reserve the whole legacy IO space to prevent any legacy drivers
   * from wasting time probing for their hardware.  This is a fairly
   * brute-force approach to disabling all non-virtual drivers.
   *
   * Note that this must be called very early to have any effect.
   */
  int paravirt_disable_iospace(void)
  {
f7743fe67   Jeremy Fitzhardinge   x86: paravirt_ops...
219
  	return request_resource(&ioport_resource, &reserve_ioports);
d572929cd   Jeremy Fitzhardinge   paravirt: helper ...
220
  }
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
221
222
223
224
  static DEFINE_PER_CPU(enum paravirt_lazy_mode, paravirt_lazy_mode) = PARAVIRT_LAZY_NONE;
  
  static inline void enter_lazy(enum paravirt_lazy_mode mode)
  {
ab2f75f0b   Jeremy Fitzhardinge   x86/paravirt: use...
225
  	BUG_ON(percpu_read(paravirt_lazy_mode) != PARAVIRT_LAZY_NONE);
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
226

ab2f75f0b   Jeremy Fitzhardinge   x86/paravirt: use...
227
  	percpu_write(paravirt_lazy_mode, mode);
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
228
  }
b407fc57b   Jeremy Fitzhardinge   x86/paravirt: flu...
229
  static void leave_lazy(enum paravirt_lazy_mode mode)
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
230
  {
ab2f75f0b   Jeremy Fitzhardinge   x86/paravirt: use...
231
  	BUG_ON(percpu_read(paravirt_lazy_mode) != mode);
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
232

ab2f75f0b   Jeremy Fitzhardinge   x86/paravirt: use...
233
  	percpu_write(paravirt_lazy_mode, PARAVIRT_LAZY_NONE);
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
234
235
236
237
238
239
240
241
242
  }
  
  void paravirt_enter_lazy_mmu(void)
  {
  	enter_lazy(PARAVIRT_LAZY_MMU);
  }
  
  void paravirt_leave_lazy_mmu(void)
  {
b407fc57b   Jeremy Fitzhardinge   x86/paravirt: flu...
243
  	leave_lazy(PARAVIRT_LAZY_MMU);
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
244
  }
224101ed6   Jeremy Fitzhardinge   x86/paravirt: fin...
245
  void paravirt_start_context_switch(struct task_struct *prev)
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
246
  {
2829b4492   Jeremy Fitzhardinge   x86/paravirt: all...
247
  	BUG_ON(preemptible());
b407fc57b   Jeremy Fitzhardinge   x86/paravirt: flu...
248
249
  	if (percpu_read(paravirt_lazy_mode) == PARAVIRT_LAZY_MMU) {
  		arch_leave_lazy_mmu_mode();
224101ed6   Jeremy Fitzhardinge   x86/paravirt: fin...
250
  		set_ti_thread_flag(task_thread_info(prev), TIF_LAZY_MMU_UPDATES);
b407fc57b   Jeremy Fitzhardinge   x86/paravirt: flu...
251
  	}
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
252
253
  	enter_lazy(PARAVIRT_LAZY_CPU);
  }
224101ed6   Jeremy Fitzhardinge   x86/paravirt: fin...
254
  void paravirt_end_context_switch(struct task_struct *next)
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
255
  {
2829b4492   Jeremy Fitzhardinge   x86/paravirt: all...
256
  	BUG_ON(preemptible());
b407fc57b   Jeremy Fitzhardinge   x86/paravirt: flu...
257
  	leave_lazy(PARAVIRT_LAZY_CPU);
224101ed6   Jeremy Fitzhardinge   x86/paravirt: fin...
258
  	if (test_and_clear_ti_thread_flag(task_thread_info(next), TIF_LAZY_MMU_UPDATES))
b407fc57b   Jeremy Fitzhardinge   x86/paravirt: flu...
259
  		arch_enter_lazy_mmu_mode();
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
260
261
262
263
  }
  
  enum paravirt_lazy_mode paravirt_get_lazy_mode(void)
  {
b8bcfe997   Jeremy Fitzhardinge   x86/paravirt: rem...
264
265
  	if (in_interrupt())
  		return PARAVIRT_LAZY_NONE;
ab2f75f0b   Jeremy Fitzhardinge   x86/paravirt: use...
266
  	return percpu_read(paravirt_lazy_mode);
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
267
  }
d85cf93da   Jeremy Fitzhardinge   x86/paravirt: mak...
268
269
270
271
272
273
274
275
276
277
278
  void arch_flush_lazy_mmu_mode(void)
  {
  	preempt_disable();
  
  	if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) {
  		arch_leave_lazy_mmu_mode();
  		arch_enter_lazy_mmu_mode();
  	}
  
  	preempt_enable();
  }
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
279
  struct pv_info pv_info = {
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
280
281
282
  	.name = "bare hardware",
  	.paravirt_enabled = 0,
  	.kernel_rpl = 0,
5311ab62c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
283
  	.shared_kernel_pmd = 1,	/* Only used when CONFIG_X86_PAE is set */
318f5a2a6   Andy Lutomirski   x86-64: Add user_...
284
285
286
287
  
  #ifdef CONFIG_X86_64
  	.extra_user_64bit_cs = __USER_CS,
  #endif
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
288
  };
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
289

93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
290
291
  struct pv_init_ops pv_init_ops = {
  	.patch = native_patch,
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
292
293
294
  };
  
  struct pv_time_ops pv_time_ops = {
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
295
  	.sched_clock = native_sched_clock,
3c404b578   Glauber Costa   KVM guest: Add a ...
296
  	.steal_clock = native_steal_clock,
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
297
298
299
  };
  
  struct pv_irq_ops pv_irq_ops = {
ecb93d1cc   Jeremy Fitzhardinge   x86/paravirt: add...
300
301
302
303
  	.save_fl = __PV_IS_CALLEE_SAVE(native_save_fl),
  	.restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl),
  	.irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable),
  	.irq_enable = __PV_IS_CALLEE_SAVE(native_irq_enable),
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
304
305
  	.safe_halt = native_safe_halt,
  	.halt = native_halt,
fab58420a   Jeremy Fitzhardinge   x86/paravirt, 64-...
306
307
308
  #ifdef CONFIG_X86_64
  	.adjust_exception_frame = paravirt_nop,
  #endif
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
309
  };
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
310

93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
311
  struct pv_cpu_ops pv_cpu_ops = {
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
312
313
314
315
316
317
  	.cpuid = native_cpuid,
  	.get_debugreg = native_get_debugreg,
  	.set_debugreg = native_set_debugreg,
  	.clts = native_clts,
  	.read_cr0 = native_read_cr0,
  	.write_cr0 = native_write_cr0,
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
318
319
320
  	.read_cr4 = native_read_cr4,
  	.read_cr4_safe = native_read_cr4_safe,
  	.write_cr4 = native_write_cr4,
88b4755f0   Glauber de Oliveira Costa   x86: fill pv_cpu_...
321
322
323
324
  #ifdef CONFIG_X86_64
  	.read_cr8 = native_read_cr8,
  	.write_cr8 = native_write_cr8,
  #endif
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
325
  	.wbinvd = native_wbinvd,
90a0a06aa   Rusty Russell   [PATCH] i386: rat...
326
  	.read_msr = native_read_msr_safe,
132ec92f3   Borislav Petkov   x86, msr: Add rd/...
327
  	.rdmsr_regs = native_rdmsr_safe_regs,
90a0a06aa   Rusty Russell   [PATCH] i386: rat...
328
  	.write_msr = native_write_msr_safe,
132ec92f3   Borislav Petkov   x86, msr: Add rd/...
329
  	.wrmsr_regs = native_wrmsr_safe_regs,
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
330
331
  	.read_tsc = native_read_tsc,
  	.read_pmc = native_read_pmc,
e5aaac443   Glauber de Oliveira Costa   x86: provide para...
332
  	.read_tscp = native_read_tscp,
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
333
334
335
336
337
338
339
340
  	.load_tr_desc = native_load_tr_desc,
  	.set_ldt = native_set_ldt,
  	.load_gdt = native_load_gdt,
  	.load_idt = native_load_idt,
  	.store_gdt = native_store_gdt,
  	.store_idt = native_store_idt,
  	.store_tr = native_store_tr,
  	.load_tls = native_load_tls,
9f9d489a3   Jeremy Fitzhardinge   x86/paravirt, 64-...
341
342
343
  #ifdef CONFIG_X86_64
  	.load_gs_index = native_load_gs_index,
  #endif
75b8bb3e5   Glauber de Oliveira Costa   x86: change write...
344
  	.write_ldt_entry = native_write_ldt_entry,
014b15be3   Glauber de Oliveira Costa   x86: change write...
345
  	.write_gdt_entry = native_write_gdt_entry,
8d947344c   Glauber de Oliveira Costa   x86: change write...
346
  	.write_idt_entry = native_write_idt_entry,
38ffbe66d   Jeremy Fitzhardinge   x86/paravirt/xen:...
347
348
349
  
  	.alloc_ldt = paravirt_nop,
  	.free_ldt = paravirt_nop,
faca62273   H. Peter Anvin   x86: use generic ...
350
  	.load_sp0 = native_load_sp0,
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
351

102d0a4b5   Jeremy Fitzhardinge   x86, paravirt, 64...
352
  #if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
d75cd22fd   Jeremy Fitzhardinge   x86/paravirt: spl...
353
  	.irq_enable_sysexit = native_irq_enable_sysexit,
102d0a4b5   Jeremy Fitzhardinge   x86, paravirt, 64...
354
  #endif
2be29982a   Jeremy Fitzhardinge   x86/paravirt: add...
355
  #ifdef CONFIG_X86_64
102d0a4b5   Jeremy Fitzhardinge   x86, paravirt, 64...
356
  #ifdef CONFIG_IA32_EMULATION
2be29982a   Jeremy Fitzhardinge   x86/paravirt: add...
357
  	.usergs_sysret32 = native_usergs_sysret32,
102d0a4b5   Jeremy Fitzhardinge   x86, paravirt, 64...
358
  #endif
2be29982a   Jeremy Fitzhardinge   x86/paravirt: add...
359
  	.usergs_sysret64 = native_usergs_sysret64,
d75cd22fd   Jeremy Fitzhardinge   x86/paravirt: spl...
360
  #endif
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
361
  	.iret = native_iret,
e801f864e   Glauber de Oliveira Costa   x86: adds paravir...
362
  	.swapgs = native_swapgs,
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
363

d3561b7fa   Rusty Russell   [PATCH] paravirt:...
364
365
  	.set_iopl_mask = native_set_iopl_mask,
  	.io_delay = native_io_delay,
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
366

224101ed6   Jeremy Fitzhardinge   x86/paravirt: fin...
367
368
  	.start_context_switch = paravirt_nop,
  	.end_context_switch = paravirt_nop,
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
369
  };
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
370

93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
371
  struct pv_apic_ops pv_apic_ops = {
13623d793   Rusty Russell   [PATCH] paravirt:...
372
  #ifdef CONFIG_X86_LOCAL_APIC
0260c196c   Jeremy Fitzhardinge   [PATCH] i386: PAR...
373
  	.startup_ipi_hook = paravirt_nop,
13623d793   Rusty Russell   [PATCH] paravirt:...
374
  #endif
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
375
  };
41edafdb7   Jeremy Fitzhardinge   x86/pvops: add a ...
376
377
  #if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE)
  /* 32-bit pagetable entries */
da5de7c22   Jeremy Fitzhardinge   x86/paravirt: use...
378
  #define PTE_IDENT	__PV_IS_CALLEE_SAVE(_paravirt_ident_32)
41edafdb7   Jeremy Fitzhardinge   x86/pvops: add a ...
379
380
  #else
  /* 64-bit pagetable entries */
da5de7c22   Jeremy Fitzhardinge   x86/paravirt: use...
381
  #define PTE_IDENT	__PV_IS_CALLEE_SAVE(_paravirt_ident_64)
41edafdb7   Jeremy Fitzhardinge   x86/pvops: add a ...
382
  #endif
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
383
  struct pv_mmu_ops pv_mmu_ops = {
b239fb250   Jeremy Fitzhardinge   [PATCH] i386: PAR...
384

93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
385
386
387
388
  	.read_cr2 = native_read_cr2,
  	.write_cr2 = native_write_cr2,
  	.read_cr3 = native_read_cr3,
  	.write_cr3 = native_write_cr3,
da181a8b3   Rusty Russell   [PATCH] paravirt:...
389
390
391
  	.flush_tlb_user = native_flush_tlb,
  	.flush_tlb_kernel = native_flush_tlb_global,
  	.flush_tlb_single = native_flush_tlb_single,
d4c104771   Jeremy Fitzhardinge   [PATCH] i386: PAR...
392
  	.flush_tlb_others = native_flush_tlb_others,
da181a8b3   Rusty Russell   [PATCH] paravirt:...
393

eba0045ff   Jeremy Fitzhardinge   x86/paravirt: add...
394
395
  	.pgd_alloc = __paravirt_pgd_alloc,
  	.pgd_free = paravirt_nop,
6944a9c89   Jeremy Fitzhardinge   x86: rename parav...
396
397
  	.alloc_pte = paravirt_nop,
  	.alloc_pmd = paravirt_nop,
2761fa092   Jeremy Fitzhardinge   x86: add pud_allo...
398
  	.alloc_pud = paravirt_nop,
6944a9c89   Jeremy Fitzhardinge   x86: rename parav...
399
400
  	.release_pte = paravirt_nop,
  	.release_pmd = paravirt_nop,
2761fa092   Jeremy Fitzhardinge   x86: add pud_allo...
401
  	.release_pud = paravirt_nop,
c119ecce8   Zachary Amsden   [PATCH] MM: page ...
402

da181a8b3   Rusty Russell   [PATCH] paravirt:...
403
404
405
  	.set_pte = native_set_pte,
  	.set_pte_at = native_set_pte_at,
  	.set_pmd = native_set_pmd,
331127f79   Andrea Arcangeli   thp: add pmd para...
406
  	.set_pmd_at = native_set_pmd_at,
458762336   Jeremy Fitzhardinge   [PATCH] i386: PAR...
407
408
  	.pte_update = paravirt_nop,
  	.pte_update_defer = paravirt_nop,
331127f79   Andrea Arcangeli   thp: add pmd para...
409
410
  	.pmd_update = paravirt_nop,
  	.pmd_update_defer = paravirt_nop,
3dc494e86   Jeremy Fitzhardinge   [PATCH] i386: PAR...
411

08b882c62   Jeremy Fitzhardinge   paravirt: add hoo...
412
413
  	.ptep_modify_prot_start = __ptep_modify_prot_start,
  	.ptep_modify_prot_commit = __ptep_modify_prot_commit,
f95f2f7b9   Eduardo Habkost   x86: fill in miss...
414
  #if PAGETABLE_LEVELS >= 3
da181a8b3   Rusty Russell   [PATCH] paravirt:...
415
416
  #ifdef CONFIG_X86_PAE
  	.set_pte_atomic = native_set_pte_atomic,
da181a8b3   Rusty Russell   [PATCH] paravirt:...
417
418
  	.pte_clear = native_pte_clear,
  	.pmd_clear = native_pmd_clear,
f95f2f7b9   Eduardo Habkost   x86: fill in miss...
419
420
  #endif
  	.set_pud = native_set_pud,
da5de7c22   Jeremy Fitzhardinge   x86/paravirt: use...
421
422
423
  
  	.pmd_val = PTE_IDENT,
  	.make_pmd = PTE_IDENT,
f95f2f7b9   Eduardo Habkost   x86: fill in miss...
424
425
  
  #if PAGETABLE_LEVELS == 4
da5de7c22   Jeremy Fitzhardinge   x86/paravirt: use...
426
427
  	.pud_val = PTE_IDENT,
  	.make_pud = PTE_IDENT,
f95f2f7b9   Eduardo Habkost   x86: fill in miss...
428
  	.set_pgd = native_set_pgd,
da181a8b3   Rusty Russell   [PATCH] paravirt:...
429
  #endif
f95f2f7b9   Eduardo Habkost   x86: fill in miss...
430
  #endif /* PAGETABLE_LEVELS >= 3 */
da181a8b3   Rusty Russell   [PATCH] paravirt:...
431

da5de7c22   Jeremy Fitzhardinge   x86/paravirt: use...
432
433
  	.pte_val = PTE_IDENT,
  	.pgd_val = PTE_IDENT,
3dc494e86   Jeremy Fitzhardinge   [PATCH] i386: PAR...
434

da5de7c22   Jeremy Fitzhardinge   x86/paravirt: use...
435
436
  	.make_pte = PTE_IDENT,
  	.make_pgd = PTE_IDENT,
3dc494e86   Jeremy Fitzhardinge   [PATCH] i386: PAR...
437

d6dd61c83   Jeremy Fitzhardinge   [PATCH] x86: PARA...
438
439
440
  	.dup_mmap = paravirt_nop,
  	.exit_mmap = paravirt_nop,
  	.activate_mm = paravirt_nop,
8965c1c09   Jeremy Fitzhardinge   paravirt: clean u...
441
442
443
444
445
  
  	.lazy_mode = {
  		.enter = paravirt_nop,
  		.leave = paravirt_nop,
  	},
aeaaa59c7   Jeremy Fitzhardinge   x86/paravirt/xen:...
446
447
  
  	.set_fixmap = native_set_fixmap,
d3561b7fa   Rusty Russell   [PATCH] paravirt:...
448
  };
0dbe5a111   Ingo Molnar   [PATCH] paravirt:...
449

93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
450
  EXPORT_SYMBOL_GPL(pv_time_ops);
f97b89549   Jeremy Fitzhardinge   x86/paravirt: rev...
451
452
  EXPORT_SYMBOL    (pv_cpu_ops);
  EXPORT_SYMBOL    (pv_mmu_ops);
93b1eab3d   Jeremy Fitzhardinge   paravirt: refacto...
453
454
455
  EXPORT_SYMBOL_GPL(pv_apic_ops);
  EXPORT_SYMBOL_GPL(pv_info);
  EXPORT_SYMBOL    (pv_irq_ops);