diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-11-29 03:50:33 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-11-29 03:50:33 -0500 |
commit | 2226340eb8df9c42f9fca74582d08d5117fc0cec (patch) | |
tree | c98370844715194600b79f886dbc391633f3e470 /arch/um/sys-i386 | |
parent | 2e06cb5859fdaeba0529806eb1bf161ffd0db201 (diff) | |
parent | 624f54be206adf970cd8eece16446b027913e533 (diff) |
Merge branch 'master'
Diffstat (limited to 'arch/um/sys-i386')
-rw-r--r-- | arch/um/sys-i386/Makefile | 2 | ||||
-rw-r--r-- | arch/um/sys-i386/ldt.c | 35 | ||||
-rw-r--r-- | arch/um/sys-i386/stub_segv.c | 11 |
3 files changed, 27 insertions, 21 deletions
diff --git a/arch/um/sys-i386/Makefile b/arch/um/sys-i386/Makefile index 6dfeb70f6957..150059dbee12 100644 --- a/arch/um/sys-i386/Makefile +++ b/arch/um/sys-i386/Makefile | |||
@@ -5,7 +5,7 @@ obj-y = bitops.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \ | |||
5 | obj-$(CONFIG_HIGHMEM) += highmem.o | 5 | obj-$(CONFIG_HIGHMEM) += highmem.o |
6 | obj-$(CONFIG_MODULES) += module.o | 6 | obj-$(CONFIG_MODULES) += module.o |
7 | 7 | ||
8 | USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o | 8 | USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o stub_segv.o |
9 | 9 | ||
10 | SYMLINKS = bitops.c semaphore.c highmem.c module.c | 10 | SYMLINKS = bitops.c semaphore.c highmem.c module.c |
11 | 11 | ||
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; |
diff --git a/arch/um/sys-i386/stub_segv.c b/arch/um/sys-i386/stub_segv.c index 1e88b275edac..a37f672ec964 100644 --- a/arch/um/sys-i386/stub_segv.c +++ b/arch/um/sys-i386/stub_segv.c | |||
@@ -3,9 +3,11 @@ | |||
3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <asm/signal.h> | 6 | #include <signal.h> |
7 | #include <sys/select.h> /* The only way I can see to get sigset_t */ | ||
7 | #include <asm/unistd.h> | 8 | #include <asm/unistd.h> |
8 | #include "uml-config.h" | 9 | #include "uml-config.h" |
10 | #include "sysdep/stub.h" | ||
9 | #include "sysdep/sigcontext.h" | 11 | #include "sysdep/sigcontext.h" |
10 | #include "sysdep/faultinfo.h" | 12 | #include "sysdep/faultinfo.h" |
11 | 13 | ||
@@ -13,13 +15,14 @@ void __attribute__ ((__section__ (".__syscall_stub"))) | |||
13 | stub_segv_handler(int sig) | 15 | stub_segv_handler(int sig) |
14 | { | 16 | { |
15 | struct sigcontext *sc = (struct sigcontext *) (&sig + 1); | 17 | struct sigcontext *sc = (struct sigcontext *) (&sig + 1); |
18 | int pid; | ||
16 | 19 | ||
17 | GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA), | 20 | GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA), |
18 | sc); | 21 | sc); |
19 | 22 | ||
20 | __asm__("movl %0, %%eax ; int $0x80": : "g" (__NR_getpid)); | 23 | pid = stub_syscall0(__NR_getpid); |
21 | __asm__("movl %%eax, %%ebx ; movl %0, %%eax ; movl %1, %%ecx ;" | 24 | stub_syscall2(__NR_kill, pid, SIGUSR1); |
22 | "int $0x80": : "g" (__NR_kill), "g" (SIGUSR1)); | 25 | |
23 | /* Load pointer to sigcontext into esp, since we need to leave | 26 | /* Load pointer to sigcontext into esp, since we need to leave |
24 | * the stack in its original form when we do the sigreturn here, by | 27 | * the stack in its original form when we do the sigreturn here, by |
25 | * hand. | 28 | * hand. |