diff options
Diffstat (limited to 'arch/um')
-rw-r--r-- | arch/um/Makefile | 2 | ||||
-rw-r--r-- | arch/um/sys-i386/ldt.c | 35 |
2 files changed, 20 insertions, 17 deletions
diff --git a/arch/um/Makefile b/arch/um/Makefile index e55d32e903bc..1b12feeba368 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile | |||
@@ -17,7 +17,7 @@ core-y += $(ARCH_DIR)/kernel/ \ | |||
17 | 17 | ||
18 | # Have to precede the include because the included Makefiles reference them. | 18 | # Have to precede the include because the included Makefiles reference them. |
19 | SYMLINK_HEADERS := archparam.h system.h sigcontext.h processor.h ptrace.h \ | 19 | SYMLINK_HEADERS := archparam.h system.h sigcontext.h processor.h ptrace.h \ |
20 | module.h vm-flags.h elf.h | 20 | module.h vm-flags.h elf.h ldt.h |
21 | SYMLINK_HEADERS := $(foreach header,$(SYMLINK_HEADERS),include/asm-um/$(header)) | 21 | SYMLINK_HEADERS := $(foreach header,$(SYMLINK_HEADERS),include/asm-um/$(header)) |
22 | 22 | ||
23 | # XXX: The "os" symlink is only used by arch/um/include/os.h, which includes | 23 | # XXX: The "os" symlink is only used by arch/um/include/os.h, which includes |
diff --git a/arch/um/sys-i386/ldt.c b/arch/um/sys-i386/ldt.c index 6360f1c958d0..17746b4c08ff 100644 --- a/arch/um/sys-i386/ldt.c +++ b/arch/um/sys-i386/ldt.c | |||
@@ -228,7 +228,7 @@ static int read_ldt(void __user * ptr, unsigned long bytecount) | |||
228 | size = LDT_ENTRY_SIZE*LDT_DIRECT_ENTRIES; | 228 | size = LDT_ENTRY_SIZE*LDT_DIRECT_ENTRIES; |
229 | if(size > bytecount) | 229 | if(size > bytecount) |
230 | size = bytecount; | 230 | size = bytecount; |
231 | if(copy_to_user(ptr, ldt->entries, size)) | 231 | if(copy_to_user(ptr, ldt->u.entries, size)) |
232 | err = -EFAULT; | 232 | err = -EFAULT; |
233 | bytecount -= size; | 233 | bytecount -= size; |
234 | ptr += size; | 234 | ptr += size; |
@@ -239,7 +239,7 @@ static int read_ldt(void __user * ptr, unsigned long bytecount) | |||
239 | size = PAGE_SIZE; | 239 | size = PAGE_SIZE; |
240 | if(size > bytecount) | 240 | if(size > bytecount) |
241 | size = bytecount; | 241 | size = bytecount; |
242 | if(copy_to_user(ptr, ldt->pages[i], size)){ | 242 | if(copy_to_user(ptr, ldt->u.pages[i], size)){ |
243 | err = -EFAULT; | 243 | err = -EFAULT; |
244 | break; | 244 | break; |
245 | } | 245 | } |
@@ -321,10 +321,11 @@ static int write_ldt(void __user * ptr, unsigned long bytecount, int func) | |||
321 | i*LDT_ENTRIES_PER_PAGE <= ldt_info.entry_number; | 321 | i*LDT_ENTRIES_PER_PAGE <= ldt_info.entry_number; |
322 | i++){ | 322 | i++){ |
323 | if(i == 0) | 323 | if(i == 0) |
324 | memcpy(&entry0, ldt->entries, sizeof(entry0)); | 324 | memcpy(&entry0, ldt->u.entries, |
325 | ldt->pages[i] = (struct ldt_entry *) | 325 | sizeof(entry0)); |
326 | __get_free_page(GFP_KERNEL|__GFP_ZERO); | 326 | ldt->u.pages[i] = (struct ldt_entry *) |
327 | if(!ldt->pages[i]){ | 327 | __get_free_page(GFP_KERNEL|__GFP_ZERO); |
328 | if(!ldt->u.pages[i]){ | ||
328 | err = -ENOMEM; | 329 | err = -ENOMEM; |
329 | /* Undo the change in host */ | 330 | /* Undo the change in host */ |
330 | memset(&ldt_info, 0, sizeof(ldt_info)); | 331 | memset(&ldt_info, 0, sizeof(ldt_info)); |
@@ -332,8 +333,9 @@ static int write_ldt(void __user * ptr, unsigned long bytecount, int func) | |||
332 | goto out_unlock; | 333 | goto out_unlock; |
333 | } | 334 | } |
334 | if(i == 0) { | 335 | if(i == 0) { |
335 | memcpy(ldt->pages[0], &entry0, sizeof(entry0)); | 336 | memcpy(ldt->u.pages[0], &entry0, |
336 | memcpy(ldt->pages[0]+1, ldt->entries+1, | 337 | sizeof(entry0)); |
338 | memcpy(ldt->u.pages[0]+1, ldt->u.entries+1, | ||
337 | sizeof(entry0)*(LDT_DIRECT_ENTRIES-1)); | 339 | sizeof(entry0)*(LDT_DIRECT_ENTRIES-1)); |
338 | } | 340 | } |
339 | ldt->entry_count = (i + 1) * LDT_ENTRIES_PER_PAGE; | 341 | ldt->entry_count = (i + 1) * LDT_ENTRIES_PER_PAGE; |
@@ -343,9 +345,9 @@ static int write_ldt(void __user * ptr, unsigned long bytecount, int func) | |||
343 | ldt->entry_count = ldt_info.entry_number + 1; | 345 | ldt->entry_count = ldt_info.entry_number + 1; |
344 | 346 | ||
345 | if(ldt->entry_count <= LDT_DIRECT_ENTRIES) | 347 | if(ldt->entry_count <= LDT_DIRECT_ENTRIES) |
346 | ldt_p = ldt->entries + ldt_info.entry_number; | 348 | ldt_p = ldt->u.entries + ldt_info.entry_number; |
347 | else | 349 | else |
348 | ldt_p = ldt->pages[ldt_info.entry_number/LDT_ENTRIES_PER_PAGE] + | 350 | ldt_p = ldt->u.pages[ldt_info.entry_number/LDT_ENTRIES_PER_PAGE] + |
349 | ldt_info.entry_number%LDT_ENTRIES_PER_PAGE; | 351 | ldt_info.entry_number%LDT_ENTRIES_PER_PAGE; |
350 | 352 | ||
351 | if(ldt_info.base_addr == 0 && ldt_info.limit == 0 && | 353 | if(ldt_info.base_addr == 0 && ldt_info.limit == 0 && |
@@ -501,8 +503,8 @@ long init_new_ldt(struct mmu_context_skas * new_mm, | |||
501 | */ | 503 | */ |
502 | down(&from_mm->ldt.semaphore); | 504 | down(&from_mm->ldt.semaphore); |
503 | if(from_mm->ldt.entry_count <= LDT_DIRECT_ENTRIES){ | 505 | if(from_mm->ldt.entry_count <= LDT_DIRECT_ENTRIES){ |
504 | memcpy(new_mm->ldt.entries, from_mm->ldt.entries, | 506 | memcpy(new_mm->ldt.u.entries, from_mm->ldt.u.entries, |
505 | sizeof(new_mm->ldt.entries)); | 507 | sizeof(new_mm->ldt.u.entries)); |
506 | } | 508 | } |
507 | else{ | 509 | else{ |
508 | i = from_mm->ldt.entry_count / LDT_ENTRIES_PER_PAGE; | 510 | i = from_mm->ldt.entry_count / LDT_ENTRIES_PER_PAGE; |
@@ -512,9 +514,10 @@ long init_new_ldt(struct mmu_context_skas * new_mm, | |||
512 | err = -ENOMEM; | 514 | err = -ENOMEM; |
513 | break; | 515 | break; |
514 | } | 516 | } |
515 | new_mm->ldt.pages[i] = (struct ldt_entry*)page; | 517 | new_mm->ldt.u.pages[i] = |
516 | memcpy(new_mm->ldt.pages[i], | 518 | (struct ldt_entry *) page; |
517 | from_mm->ldt.pages[i], PAGE_SIZE); | 519 | memcpy(new_mm->ldt.u.pages[i], |
520 | from_mm->ldt.u.pages[i], PAGE_SIZE); | ||
518 | } | 521 | } |
519 | } | 522 | } |
520 | new_mm->ldt.entry_count = from_mm->ldt.entry_count; | 523 | new_mm->ldt.entry_count = from_mm->ldt.entry_count; |
@@ -532,7 +535,7 @@ void free_ldt(struct mmu_context_skas * mm) | |||
532 | if(!ptrace_ldt && mm->ldt.entry_count > LDT_DIRECT_ENTRIES){ | 535 | if(!ptrace_ldt && mm->ldt.entry_count > LDT_DIRECT_ENTRIES){ |
533 | i = mm->ldt.entry_count / LDT_ENTRIES_PER_PAGE; | 536 | i = mm->ldt.entry_count / LDT_ENTRIES_PER_PAGE; |
534 | while(i-- > 0){ | 537 | while(i-- > 0){ |
535 | free_page((long )mm->ldt.pages[i]); | 538 | free_page((long )mm->ldt.u.pages[i]); |
536 | } | 539 | } |
537 | } | 540 | } |
538 | mm->ldt.entry_count = 0; | 541 | mm->ldt.entry_count = 0; |