| .. | .. | 
|---|
| 40 | 40 |  	desc->l			= 0; | 
|---|
| 41 | 41 |  } | 
|---|
| 42 | 42 |   | 
|---|
| 43 |  | -extern struct desc_ptr idt_descr;  | 
|---|
| 44 |  | -extern gate_desc idt_table[];  | 
|---|
| 45 |  | -extern const struct desc_ptr debug_idt_descr;  | 
|---|
| 46 |  | -extern gate_desc debug_idt_table[];  | 
|---|
| 47 |  | -  | 
|---|
| 48 | 43 |  struct gdt_page { | 
|---|
| 49 | 44 |  	struct desc_struct gdt[GDT_ENTRIES]; | 
|---|
| 50 | 45 |  } __attribute__((aligned(PAGE_SIZE))); | 
|---|
| .. | .. | 
|---|
| 108 | 103 |  	return !(desc[0] | desc[1]); | 
|---|
| 109 | 104 |  } | 
|---|
| 110 | 105 |   | 
|---|
| 111 |  | -#ifdef CONFIG_PARAVIRT  | 
|---|
 | 106 | +#ifdef CONFIG_PARAVIRT_XXL  | 
|---|
| 112 | 107 |  #include <asm/paravirt.h> | 
|---|
| 113 | 108 |  #else | 
|---|
| 114 | 109 |  #define load_TR_desc()				native_load_tr_desc() | 
|---|
| .. | .. | 
|---|
| 134 | 129 |  static inline void paravirt_free_ldt(struct desc_struct *ldt, unsigned entries) | 
|---|
| 135 | 130 |  { | 
|---|
| 136 | 131 |  } | 
|---|
| 137 |  | -#endif	/* CONFIG_PARAVIRT */  | 
|---|
 | 132 | +#endif	/* CONFIG_PARAVIRT_XXL */  | 
|---|
| 138 | 133 |   | 
|---|
| 139 | 134 |  #define store_ldt(ldt) asm("sldt %0" : "=m"(ldt)) | 
|---|
| 140 | 135 |   | 
|---|
| .. | .. | 
|---|
| 214 | 209 |  	asm volatile("lgdt %0"::"m" (*dtr)); | 
|---|
| 215 | 210 |  } | 
|---|
| 216 | 211 |   | 
|---|
| 217 |  | -static inline void native_load_idt(const struct desc_ptr *dtr)  | 
|---|
 | 212 | +static __always_inline void native_load_idt(const struct desc_ptr *dtr)  | 
|---|
| 218 | 213 |  { | 
|---|
| 219 | 214 |  	asm volatile("lidt %0"::"m" (*dtr)); | 
|---|
| 220 | 215 |  } | 
|---|
| .. | .. | 
|---|
| 386 | 381 |  	desc->limit1 = (limit >> 16) & 0xf; | 
|---|
| 387 | 382 |  } | 
|---|
| 388 | 383 |   | 
|---|
| 389 |  | -void update_intr_gate(unsigned int n, const void *addr);  | 
|---|
| 390 | 384 |  void alloc_intr_gate(unsigned int n, const void *addr); | 
|---|
 | 385 | +  | 
|---|
 | 386 | +static inline void init_idt_data(struct idt_data *data, unsigned int n,  | 
|---|
 | 387 | +				 const void *addr)  | 
|---|
 | 388 | +{  | 
|---|
 | 389 | +	BUG_ON(n > 0xFF);  | 
|---|
 | 390 | +  | 
|---|
 | 391 | +	memset(data, 0, sizeof(*data));  | 
|---|
 | 392 | +	data->vector	= n;  | 
|---|
 | 393 | +	data->addr	= addr;  | 
|---|
 | 394 | +	data->segment	= __KERNEL_CS;  | 
|---|
 | 395 | +	data->bits.type	= GATE_INTERRUPT;  | 
|---|
 | 396 | +	data->bits.p	= 1;  | 
|---|
 | 397 | +}  | 
|---|
 | 398 | +  | 
|---|
 | 399 | +static inline void idt_init_desc(gate_desc *gate, const struct idt_data *d)  | 
|---|
 | 400 | +{  | 
|---|
 | 401 | +	unsigned long addr = (unsigned long) d->addr;  | 
|---|
 | 402 | +  | 
|---|
 | 403 | +	gate->offset_low	= (u16) addr;  | 
|---|
 | 404 | +	gate->segment		= (u16) d->segment;  | 
|---|
 | 405 | +	gate->bits		= d->bits;  | 
|---|
 | 406 | +	gate->offset_middle	= (u16) (addr >> 16);  | 
|---|
 | 407 | +#ifdef CONFIG_X86_64  | 
|---|
 | 408 | +	gate->offset_high	= (u32) (addr >> 32);  | 
|---|
 | 409 | +	gate->reserved		= 0;  | 
|---|
 | 410 | +#endif  | 
|---|
 | 411 | +}  | 
|---|
| 391 | 412 |   | 
|---|
| 392 | 413 |  extern unsigned long system_vectors[]; | 
|---|
| 393 | 414 |   | 
|---|
| 394 |  | -#ifdef CONFIG_X86_64  | 
|---|
| 395 |  | -DECLARE_PER_CPU(u32, debug_idt_ctr);  | 
|---|
| 396 |  | -static inline bool is_debug_idt_enabled(void)  | 
|---|
| 397 |  | -{  | 
|---|
| 398 |  | -	if (this_cpu_read(debug_idt_ctr))  | 
|---|
| 399 |  | -		return true;  | 
|---|
| 400 |  | -  | 
|---|
| 401 |  | -	return false;  | 
|---|
| 402 |  | -}  | 
|---|
| 403 |  | -  | 
|---|
| 404 |  | -static inline void load_debug_idt(void)  | 
|---|
| 405 |  | -{  | 
|---|
| 406 |  | -	load_idt((const struct desc_ptr *)&debug_idt_descr);  | 
|---|
| 407 |  | -}  | 
|---|
| 408 |  | -#else  | 
|---|
| 409 |  | -static inline bool is_debug_idt_enabled(void)  | 
|---|
| 410 |  | -{  | 
|---|
| 411 |  | -	return false;  | 
|---|
| 412 |  | -}  | 
|---|
| 413 |  | -  | 
|---|
| 414 |  | -static inline void load_debug_idt(void)  | 
|---|
| 415 |  | -{  | 
|---|
| 416 |  | -}  | 
|---|
| 417 |  | -#endif  | 
|---|
| 418 |  | -  | 
|---|
| 419 |  | -/*  | 
|---|
| 420 |  | - * The load_current_idt() must be called with interrupts disabled  | 
|---|
| 421 |  | - * to avoid races. That way the IDT will always be set back to the expected  | 
|---|
| 422 |  | - * descriptor. It's also called when a CPU is being initialized, and  | 
|---|
| 423 |  | - * that doesn't need to disable interrupts, as nothing should be  | 
|---|
| 424 |  | - * bothering the CPU then.  | 
|---|
| 425 |  | - */  | 
|---|
| 426 |  | -static inline void load_current_idt(void)  | 
|---|
| 427 |  | -{  | 
|---|
| 428 |  | -	if (is_debug_idt_enabled())  | 
|---|
| 429 |  | -		load_debug_idt();  | 
|---|
| 430 |  | -	else  | 
|---|
| 431 |  | -		load_idt((const struct desc_ptr *)&idt_descr);  | 
|---|
| 432 |  | -}  | 
|---|
| 433 |  | -  | 
|---|
 | 415 | +extern void load_current_idt(void);  | 
|---|
| 434 | 416 |  extern void idt_setup_early_handler(void); | 
|---|
| 435 | 417 |  extern void idt_setup_early_traps(void); | 
|---|
| 436 | 418 |  extern void idt_setup_traps(void); | 
|---|
| 437 | 419 |  extern void idt_setup_apic_and_irq_gates(void); | 
|---|
 | 420 | +extern bool idt_is_f00f_address(unsigned long address);  | 
|---|
| 438 | 421 |   | 
|---|
| 439 | 422 |  #ifdef CONFIG_X86_64 | 
|---|
| 440 | 423 |  extern void idt_setup_early_pf(void); | 
|---|
| 441 | 424 |  extern void idt_setup_ist_traps(void); | 
|---|
| 442 |  | -extern void idt_setup_debugidt_traps(void);  | 
|---|
| 443 | 425 |  #else | 
|---|
| 444 | 426 |  static inline void idt_setup_early_pf(void) { } | 
|---|
| 445 | 427 |  static inline void idt_setup_ist_traps(void) { } | 
|---|
| 446 |  | -static inline void idt_setup_debugidt_traps(void) { }  | 
|---|
| 447 | 428 |  #endif | 
|---|
| 448 | 429 |   | 
|---|
| 449 | 430 |  extern void idt_invalidate(void *addr); | 
|---|