diff options
Diffstat (limited to 'arch/x86/kernel/ldt.c')
| -rw-r--r-- | arch/x86/kernel/ldt.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c index 0ed5f939b905..eee32b43fee3 100644 --- a/arch/x86/kernel/ldt.c +++ b/arch/x86/kernel/ldt.c | |||
| @@ -52,6 +52,8 @@ static int alloc_ldt(mm_context_t *pc, int mincount, int reload) | |||
| 52 | memset(newldt + oldsize * LDT_ENTRY_SIZE, 0, | 52 | memset(newldt + oldsize * LDT_ENTRY_SIZE, 0, |
| 53 | (mincount - oldsize) * LDT_ENTRY_SIZE); | 53 | (mincount - oldsize) * LDT_ENTRY_SIZE); |
| 54 | 54 | ||
| 55 | paravirt_alloc_ldt(newldt, mincount); | ||
| 56 | |||
| 55 | #ifdef CONFIG_X86_64 | 57 | #ifdef CONFIG_X86_64 |
| 56 | /* CHECKME: Do we really need this ? */ | 58 | /* CHECKME: Do we really need this ? */ |
| 57 | wmb(); | 59 | wmb(); |
| @@ -74,6 +76,7 @@ static int alloc_ldt(mm_context_t *pc, int mincount, int reload) | |||
| 74 | #endif | 76 | #endif |
| 75 | } | 77 | } |
| 76 | if (oldsize) { | 78 | if (oldsize) { |
| 79 | paravirt_free_ldt(oldldt, oldsize); | ||
| 77 | if (oldsize * LDT_ENTRY_SIZE > PAGE_SIZE) | 80 | if (oldsize * LDT_ENTRY_SIZE > PAGE_SIZE) |
| 78 | vfree(oldldt); | 81 | vfree(oldldt); |
| 79 | else | 82 | else |
| @@ -85,10 +88,13 @@ static int alloc_ldt(mm_context_t *pc, int mincount, int reload) | |||
| 85 | static inline int copy_ldt(mm_context_t *new, mm_context_t *old) | 88 | static inline int copy_ldt(mm_context_t *new, mm_context_t *old) |
| 86 | { | 89 | { |
| 87 | int err = alloc_ldt(new, old->size, 0); | 90 | int err = alloc_ldt(new, old->size, 0); |
| 91 | int i; | ||
| 88 | 92 | ||
| 89 | if (err < 0) | 93 | if (err < 0) |
| 90 | return err; | 94 | return err; |
| 91 | memcpy(new->ldt, old->ldt, old->size * LDT_ENTRY_SIZE); | 95 | |
| 96 | for(i = 0; i < old->size; i++) | ||
| 97 | write_ldt_entry(new->ldt, i, old->ldt + i * LDT_ENTRY_SIZE); | ||
| 92 | return 0; | 98 | return 0; |
| 93 | } | 99 | } |
| 94 | 100 | ||
| @@ -125,6 +131,7 @@ void destroy_context(struct mm_struct *mm) | |||
| 125 | if (mm == current->active_mm) | 131 | if (mm == current->active_mm) |
| 126 | clear_LDT(); | 132 | clear_LDT(); |
| 127 | #endif | 133 | #endif |
| 134 | paravirt_free_ldt(mm->context.ldt, mm->context.size); | ||
| 128 | if (mm->context.size * LDT_ENTRY_SIZE > PAGE_SIZE) | 135 | if (mm->context.size * LDT_ENTRY_SIZE > PAGE_SIZE) |
| 129 | vfree(mm->context.ldt); | 136 | vfree(mm->context.ldt); |
| 130 | else | 137 | else |
