diff options
Diffstat (limited to 'include/asm-i386')
-rw-r--r-- | include/asm-i386/mmu_context.h | 17 | ||||
-rw-r--r-- | include/asm-i386/paravirt.h | 23 |
2 files changed, 38 insertions, 2 deletions
diff --git a/include/asm-i386/mmu_context.h b/include/asm-i386/mmu_context.h index e6aa30f8de5b..8198d1cca1f3 100644 --- a/include/asm-i386/mmu_context.h +++ b/include/asm-i386/mmu_context.h | |||
@@ -5,6 +5,16 @@ | |||
5 | #include <asm/atomic.h> | 5 | #include <asm/atomic.h> |
6 | #include <asm/pgalloc.h> | 6 | #include <asm/pgalloc.h> |
7 | #include <asm/tlbflush.h> | 7 | #include <asm/tlbflush.h> |
8 | #include <asm/paravirt.h> | ||
9 | #ifndef CONFIG_PARAVIRT | ||
10 | #include <asm-generic/mm_hooks.h> | ||
11 | |||
12 | static inline void paravirt_activate_mm(struct mm_struct *prev, | ||
13 | struct mm_struct *next) | ||
14 | { | ||
15 | } | ||
16 | #endif /* !CONFIG_PARAVIRT */ | ||
17 | |||
8 | 18 | ||
9 | /* | 19 | /* |
10 | * Used for LDT copy/destruction. | 20 | * Used for LDT copy/destruction. |
@@ -65,7 +75,10 @@ static inline void switch_mm(struct mm_struct *prev, | |||
65 | #define deactivate_mm(tsk, mm) \ | 75 | #define deactivate_mm(tsk, mm) \ |
66 | asm("movl %0,%%gs": :"r" (0)); | 76 | asm("movl %0,%%gs": :"r" (0)); |
67 | 77 | ||
68 | #define activate_mm(prev, next) \ | 78 | #define activate_mm(prev, next) \ |
69 | switch_mm((prev),(next),NULL) | 79 | do { \ |
80 | paravirt_activate_mm(prev, next); \ | ||
81 | switch_mm((prev),(next),NULL); \ | ||
82 | } while(0); | ||
70 | 83 | ||
71 | #endif | 84 | #endif |
diff --git a/include/asm-i386/paravirt.h b/include/asm-i386/paravirt.h index f93599dc7756..61c03f1e0c29 100644 --- a/include/asm-i386/paravirt.h +++ b/include/asm-i386/paravirt.h | |||
@@ -119,6 +119,12 @@ struct paravirt_ops | |||
119 | 119 | ||
120 | void (*io_delay)(void); | 120 | void (*io_delay)(void); |
121 | 121 | ||
122 | void (*activate_mm)(struct mm_struct *prev, | ||
123 | struct mm_struct *next); | ||
124 | void (*dup_mmap)(struct mm_struct *oldmm, | ||
125 | struct mm_struct *mm); | ||
126 | void (*exit_mmap)(struct mm_struct *mm); | ||
127 | |||
122 | #ifdef CONFIG_X86_LOCAL_APIC | 128 | #ifdef CONFIG_X86_LOCAL_APIC |
123 | void (*apic_write)(unsigned long reg, unsigned long v); | 129 | void (*apic_write)(unsigned long reg, unsigned long v); |
124 | void (*apic_write_atomic)(unsigned long reg, unsigned long v); | 130 | void (*apic_write_atomic)(unsigned long reg, unsigned long v); |
@@ -395,6 +401,23 @@ static inline void startup_ipi_hook(int phys_apicid, unsigned long start_eip, | |||
395 | } | 401 | } |
396 | #endif | 402 | #endif |
397 | 403 | ||
404 | static inline void paravirt_activate_mm(struct mm_struct *prev, | ||
405 | struct mm_struct *next) | ||
406 | { | ||
407 | paravirt_ops.activate_mm(prev, next); | ||
408 | } | ||
409 | |||
410 | static inline void arch_dup_mmap(struct mm_struct *oldmm, | ||
411 | struct mm_struct *mm) | ||
412 | { | ||
413 | paravirt_ops.dup_mmap(oldmm, mm); | ||
414 | } | ||
415 | |||
416 | static inline void arch_exit_mmap(struct mm_struct *mm) | ||
417 | { | ||
418 | paravirt_ops.exit_mmap(mm); | ||
419 | } | ||
420 | |||
398 | #define __flush_tlb() paravirt_ops.flush_tlb_user() | 421 | #define __flush_tlb() paravirt_ops.flush_tlb_user() |
399 | #define __flush_tlb_global() paravirt_ops.flush_tlb_kernel() | 422 | #define __flush_tlb_global() paravirt_ops.flush_tlb_kernel() |
400 | #define __flush_tlb_single(addr) paravirt_ops.flush_tlb_single(addr) | 423 | #define __flush_tlb_single(addr) paravirt_ops.flush_tlb_single(addr) |