diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-26 18:08:07 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-26 18:08:07 -0500 |
commit | 66673f13c10a817e27d71434c1198a4d874e0cd3 (patch) | |
tree | 5699cfff89ad90caf4cb4aff33deee108c4a286e | |
parent | bf50c903faba4ec7686ee8a570ac384b0f20814d (diff) | |
parent | fcd26f7ae2ea5889134e8b3d60a42ce8b993c95f (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6:
sparc64: Fix DAX handling via userspace access from kernel.
sparc64: Annotate sparc64 specific syscalls with SYSCALL_DEFINEx()
[CVE-2009-0029] sparc: Enable syscall wrappers for 64-bit
sparc64: Initialize FHC/CLOCK LED platform_device 'id' field correctly.
sparc64: fix modpost failure
sparc64: fix readout of cpu/fpu type
-rw-r--r-- | arch/sparc/Kconfig | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/central.c | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/cpu.c | 18 | ||||
-rw-r--r-- | arch/sparc/kernel/sys_sparc_64.c | 48 | ||||
-rw-r--r-- | arch/sparc/kernel/syscalls.S | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/systbls.h | 3 | ||||
-rw-r--r-- | arch/sparc/kernel/systbls_64.S | 16 | ||||
-rw-r--r-- | arch/sparc/kernel/traps_64.c | 17 | ||||
-rw-r--r-- | arch/sparc/lib/Makefile | 3 |
9 files changed, 68 insertions, 42 deletions
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index de58c02633b4..c3ea215334f6 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -36,6 +36,7 @@ config SPARC64 | |||
36 | select HAVE_KRETPROBES | 36 | select HAVE_KRETPROBES |
37 | select HAVE_KPROBES | 37 | select HAVE_KPROBES |
38 | select HAVE_LMB | 38 | select HAVE_LMB |
39 | select HAVE_SYSCALL_WRAPPERS | ||
39 | select USE_GENERIC_SMP_HELPERS if SMP | 40 | select USE_GENERIC_SMP_HELPERS if SMP |
40 | select RTC_DRV_CMOS | 41 | select RTC_DRV_CMOS |
41 | select RTC_DRV_BQ4802 | 42 | select RTC_DRV_BQ4802 |
diff --git a/arch/sparc/kernel/central.c b/arch/sparc/kernel/central.c index 05f1c916db06..f3b5466c389c 100644 --- a/arch/sparc/kernel/central.c +++ b/arch/sparc/kernel/central.c | |||
@@ -103,6 +103,7 @@ static int __devinit clock_board_probe(struct of_device *op, | |||
103 | p->leds_resource.name = "leds"; | 103 | p->leds_resource.name = "leds"; |
104 | 104 | ||
105 | p->leds_pdev.name = "sunfire-clockboard-leds"; | 105 | p->leds_pdev.name = "sunfire-clockboard-leds"; |
106 | p->leds_pdev.id = -1; | ||
106 | p->leds_pdev.resource = &p->leds_resource; | 107 | p->leds_pdev.resource = &p->leds_resource; |
107 | p->leds_pdev.num_resources = 1; | 108 | p->leds_pdev.num_resources = 1; |
108 | p->leds_pdev.dev.parent = &op->dev; | 109 | p->leds_pdev.dev.parent = &op->dev; |
@@ -197,6 +198,7 @@ static int __devinit fhc_probe(struct of_device *op, | |||
197 | p->leds_resource.name = "leds"; | 198 | p->leds_resource.name = "leds"; |
198 | 199 | ||
199 | p->leds_pdev.name = "sunfire-fhc-leds"; | 200 | p->leds_pdev.name = "sunfire-fhc-leds"; |
201 | p->leds_pdev.id = p->board_num; | ||
200 | p->leds_pdev.resource = &p->leds_resource; | 202 | p->leds_pdev.resource = &p->leds_resource; |
201 | p->leds_pdev.num_resources = 1; | 203 | p->leds_pdev.num_resources = 1; |
202 | p->leds_pdev.dev.parent = &op->dev; | 204 | p->leds_pdev.dev.parent = &op->dev; |
diff --git a/arch/sparc/kernel/cpu.c b/arch/sparc/kernel/cpu.c index f0b825505da5..32d32b4824f5 100644 --- a/arch/sparc/kernel/cpu.c +++ b/arch/sparc/kernel/cpu.c | |||
@@ -239,14 +239,26 @@ unsigned int fsr_storage; | |||
239 | 239 | ||
240 | static void set_cpu_and_fpu(int psr_impl, int psr_vers, int fpu_vers) | 240 | static void set_cpu_and_fpu(int psr_impl, int psr_vers, int fpu_vers) |
241 | { | 241 | { |
242 | const struct manufacturer_info *manuf; | ||
243 | int i; | ||
244 | |||
242 | sparc_cpu_type = NULL; | 245 | sparc_cpu_type = NULL; |
243 | sparc_fpu_type = NULL; | 246 | sparc_fpu_type = NULL; |
244 | if (psr_impl < ARRAY_SIZE(manufacturer_info)) | 247 | manuf = NULL; |
248 | |||
249 | for (i = 0; i < ARRAY_SIZE(manufacturer_info); i++) | ||
250 | { | ||
251 | if (psr_impl == manufacturer_info[i].psr_impl) { | ||
252 | manuf = &manufacturer_info[i]; | ||
253 | break; | ||
254 | } | ||
255 | } | ||
256 | if (manuf != NULL) | ||
245 | { | 257 | { |
246 | const struct cpu_info *cpu; | 258 | const struct cpu_info *cpu; |
247 | const struct fpu_info *fpu; | 259 | const struct fpu_info *fpu; |
248 | 260 | ||
249 | cpu = &manufacturer_info[psr_impl].cpu_info[0]; | 261 | cpu = &manuf->cpu_info[0]; |
250 | while (cpu->psr_vers != -1) | 262 | while (cpu->psr_vers != -1) |
251 | { | 263 | { |
252 | if (cpu->psr_vers == psr_vers) { | 264 | if (cpu->psr_vers == psr_vers) { |
@@ -256,7 +268,7 @@ static void set_cpu_and_fpu(int psr_impl, int psr_vers, int fpu_vers) | |||
256 | } | 268 | } |
257 | cpu++; | 269 | cpu++; |
258 | } | 270 | } |
259 | fpu = &manufacturer_info[psr_impl].fpu_info[0]; | 271 | fpu = &manuf->fpu_info[0]; |
260 | while (fpu->fp_vers != -1) | 272 | while (fpu->fp_vers != -1) |
261 | { | 273 | { |
262 | if (fpu->fp_vers == fpu_vers) { | 274 | if (fpu->fp_vers == fpu_vers) { |
diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 09058fc39e73..e2d102447a43 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c | |||
@@ -399,7 +399,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm) | |||
399 | } | 399 | } |
400 | } | 400 | } |
401 | 401 | ||
402 | asmlinkage unsigned long sparc_brk(unsigned long brk) | 402 | SYSCALL_DEFINE1(sparc_brk, unsigned long, brk) |
403 | { | 403 | { |
404 | /* People could try to be nasty and use ta 0x6d in 32bit programs */ | 404 | /* People could try to be nasty and use ta 0x6d in 32bit programs */ |
405 | if (test_thread_flag(TIF_32BIT) && brk >= STACK_TOP32) | 405 | if (test_thread_flag(TIF_32BIT) && brk >= STACK_TOP32) |
@@ -415,7 +415,7 @@ asmlinkage unsigned long sparc_brk(unsigned long brk) | |||
415 | * sys_pipe() is the normal C calling standard for creating | 415 | * sys_pipe() is the normal C calling standard for creating |
416 | * a pipe. It's not the way unix traditionally does this, though. | 416 | * a pipe. It's not the way unix traditionally does this, though. |
417 | */ | 417 | */ |
418 | asmlinkage long sparc_pipe(struct pt_regs *regs) | 418 | SYSCALL_DEFINE1(sparc_pipe_real, struct pt_regs *, regs) |
419 | { | 419 | { |
420 | int fd[2]; | 420 | int fd[2]; |
421 | int error; | 421 | int error; |
@@ -435,8 +435,8 @@ out: | |||
435 | * This is really horribly ugly. | 435 | * This is really horribly ugly. |
436 | */ | 436 | */ |
437 | 437 | ||
438 | asmlinkage long sys_ipc(unsigned int call, int first, unsigned long second, | 438 | SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second, |
439 | unsigned long third, void __user *ptr, long fifth) | 439 | unsigned long, third, void __user *, ptr, long, fifth) |
440 | { | 440 | { |
441 | long err; | 441 | long err; |
442 | 442 | ||
@@ -519,7 +519,7 @@ out: | |||
519 | return err; | 519 | return err; |
520 | } | 520 | } |
521 | 521 | ||
522 | asmlinkage long sparc64_newuname(struct new_utsname __user *name) | 522 | SYSCALL_DEFINE1(sparc64_newuname, struct new_utsname __user *, name) |
523 | { | 523 | { |
524 | int ret = sys_newuname(name); | 524 | int ret = sys_newuname(name); |
525 | 525 | ||
@@ -530,7 +530,7 @@ asmlinkage long sparc64_newuname(struct new_utsname __user *name) | |||
530 | return ret; | 530 | return ret; |
531 | } | 531 | } |
532 | 532 | ||
533 | asmlinkage long sparc64_personality(unsigned long personality) | 533 | SYSCALL_DEFINE1(sparc64_personality, unsigned long, personality) |
534 | { | 534 | { |
535 | int ret; | 535 | int ret; |
536 | 536 | ||
@@ -564,9 +564,9 @@ int sparc_mmap_check(unsigned long addr, unsigned long len) | |||
564 | } | 564 | } |
565 | 565 | ||
566 | /* Linux version of mmap */ | 566 | /* Linux version of mmap */ |
567 | asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, | 567 | SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, |
568 | unsigned long prot, unsigned long flags, unsigned long fd, | 568 | unsigned long, prot, unsigned long, flags, unsigned long, fd, |
569 | unsigned long off) | 569 | unsigned long, off) |
570 | { | 570 | { |
571 | struct file * file = NULL; | 571 | struct file * file = NULL; |
572 | unsigned long retval = -EBADF; | 572 | unsigned long retval = -EBADF; |
@@ -589,7 +589,7 @@ out: | |||
589 | return retval; | 589 | return retval; |
590 | } | 590 | } |
591 | 591 | ||
592 | asmlinkage long sys64_munmap(unsigned long addr, size_t len) | 592 | SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len) |
593 | { | 593 | { |
594 | long ret; | 594 | long ret; |
595 | 595 | ||
@@ -606,9 +606,9 @@ extern unsigned long do_mremap(unsigned long addr, | |||
606 | unsigned long old_len, unsigned long new_len, | 606 | unsigned long old_len, unsigned long new_len, |
607 | unsigned long flags, unsigned long new_addr); | 607 | unsigned long flags, unsigned long new_addr); |
608 | 608 | ||
609 | asmlinkage unsigned long sys64_mremap(unsigned long addr, | 609 | SYSCALL_DEFINE5(64_mremap, unsigned long, addr, unsigned long, old_len, |
610 | unsigned long old_len, unsigned long new_len, | 610 | unsigned long, new_len, unsigned long, flags, |
611 | unsigned long flags, unsigned long new_addr) | 611 | unsigned long, new_addr) |
612 | { | 612 | { |
613 | unsigned long ret = -EINVAL; | 613 | unsigned long ret = -EINVAL; |
614 | 614 | ||
@@ -671,7 +671,7 @@ asmlinkage void sparc_breakpoint(struct pt_regs *regs) | |||
671 | 671 | ||
672 | extern void check_pending(int signum); | 672 | extern void check_pending(int signum); |
673 | 673 | ||
674 | asmlinkage long sys_getdomainname(char __user *name, int len) | 674 | SYSCALL_DEFINE2(getdomainname, char __user *, name, int, len) |
675 | { | 675 | { |
676 | int nlen, err; | 676 | int nlen, err; |
677 | 677 | ||
@@ -694,11 +694,10 @@ out: | |||
694 | return err; | 694 | return err; |
695 | } | 695 | } |
696 | 696 | ||
697 | asmlinkage long sys_utrap_install(utrap_entry_t type, | 697 | SYSCALL_DEFINE5(utrap_install, utrap_entry_t, type, |
698 | utrap_handler_t new_p, | 698 | utrap_handler_t, new_p, utrap_handler_t, new_d, |
699 | utrap_handler_t new_d, | 699 | utrap_handler_t __user *, old_p, |
700 | utrap_handler_t __user *old_p, | 700 | utrap_handler_t __user *, old_d) |
701 | utrap_handler_t __user *old_d) | ||
702 | { | 701 | { |
703 | if (type < UT_INSTRUCTION_EXCEPTION || type > UT_TRAP_INSTRUCTION_31) | 702 | if (type < UT_INSTRUCTION_EXCEPTION || type > UT_TRAP_INSTRUCTION_31) |
704 | return -EINVAL; | 703 | return -EINVAL; |
@@ -764,11 +763,9 @@ asmlinkage long sparc_memory_ordering(unsigned long model, | |||
764 | return 0; | 763 | return 0; |
765 | } | 764 | } |
766 | 765 | ||
767 | asmlinkage long sys_rt_sigaction(int sig, | 766 | SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act, |
768 | const struct sigaction __user *act, | 767 | struct sigaction __user *, oact, void __user *, restorer, |
769 | struct sigaction __user *oact, | 768 | size_t, sigsetsize) |
770 | void __user *restorer, | ||
771 | size_t sigsetsize) | ||
772 | { | 769 | { |
773 | struct k_sigaction new_ka, old_ka; | 770 | struct k_sigaction new_ka, old_ka; |
774 | int ret; | 771 | int ret; |
@@ -808,7 +805,8 @@ asmlinkage void update_perfctrs(void) | |||
808 | reset_pic(); | 805 | reset_pic(); |
809 | } | 806 | } |
810 | 807 | ||
811 | asmlinkage long sys_perfctr(int opcode, unsigned long arg0, unsigned long arg1, unsigned long arg2) | 808 | SYSCALL_DEFINE4(perfctr, int, opcode, unsigned long, arg0, |
809 | unsigned long, arg1, unsigned long, arg2) | ||
812 | { | 810 | { |
813 | int err = 0; | 811 | int err = 0; |
814 | 812 | ||
diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S index 87f5a3b8a253..d150c2aa98d2 100644 --- a/arch/sparc/kernel/syscalls.S +++ b/arch/sparc/kernel/syscalls.S | |||
@@ -21,7 +21,7 @@ execve_merge: | |||
21 | 21 | ||
22 | .align 32 | 22 | .align 32 |
23 | sys_sparc_pipe: | 23 | sys_sparc_pipe: |
24 | ba,pt %xcc, sparc_pipe | 24 | ba,pt %xcc, sys_sparc_pipe_real |
25 | add %sp, PTREGS_OFF, %o0 | 25 | add %sp, PTREGS_OFF, %o0 |
26 | sys_nis_syscall: | 26 | sys_nis_syscall: |
27 | ba,pt %xcc, c_sys_nis_syscall | 27 | ba,pt %xcc, c_sys_nis_syscall |
diff --git a/arch/sparc/kernel/systbls.h b/arch/sparc/kernel/systbls.h index bc9f5dac4069..15c2d752b2bc 100644 --- a/arch/sparc/kernel/systbls.h +++ b/arch/sparc/kernel/systbls.h | |||
@@ -16,9 +16,6 @@ extern asmlinkage long sys_ipc(unsigned int call, int first, | |||
16 | void __user *ptr, long fifth); | 16 | void __user *ptr, long fifth); |
17 | extern asmlinkage long sparc64_newuname(struct new_utsname __user *name); | 17 | extern asmlinkage long sparc64_newuname(struct new_utsname __user *name); |
18 | extern asmlinkage long sparc64_personality(unsigned long personality); | 18 | extern asmlinkage long sparc64_personality(unsigned long personality); |
19 | extern asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, | ||
20 | unsigned long prot, unsigned long flags, | ||
21 | unsigned long fd, unsigned long off); | ||
22 | extern asmlinkage long sys64_munmap(unsigned long addr, size_t len); | 19 | extern asmlinkage long sys64_munmap(unsigned long addr, size_t len); |
23 | extern asmlinkage unsigned long sys64_mremap(unsigned long addr, | 20 | extern asmlinkage unsigned long sys64_mremap(unsigned long addr, |
24 | unsigned long old_len, | 21 | unsigned long old_len, |
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index e6007bb37046..f93c42a2b522 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S | |||
@@ -21,7 +21,7 @@ sys_call_table32: | |||
21 | /*0*/ .word sys_restart_syscall, sys32_exit, sys_fork, sys_read, sys_write | 21 | /*0*/ .word sys_restart_syscall, sys32_exit, sys_fork, sys_read, sys_write |
22 | /*5*/ .word sys32_open, sys_close, sys32_wait4, sys32_creat, sys_link | 22 | /*5*/ .word sys32_open, sys_close, sys32_wait4, sys32_creat, sys_link |
23 | /*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod | 23 | /*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod |
24 | /*15*/ .word sys_chmod, sys_lchown16, sparc_brk, sys32_perfctr, sys32_lseek | 24 | /*15*/ .word sys_chmod, sys_lchown16, sys_sparc_brk, sys32_perfctr, sys32_lseek |
25 | /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16 | 25 | /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16 |
26 | /*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys_pause | 26 | /*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys_pause |
27 | /*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice | 27 | /*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice |
@@ -55,8 +55,8 @@ sys_call_table32: | |||
55 | /*170*/ .word sys32_lsetxattr, sys32_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents | 55 | /*170*/ .word sys32_lsetxattr, sys32_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents |
56 | .word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr | 56 | .word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr |
57 | /*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall | 57 | /*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall |
58 | .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sparc64_newuname | 58 | .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sys_sparc64_newuname |
59 | /*190*/ .word sys32_init_module, sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl | 59 | /*190*/ .word sys32_init_module, sys_sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl |
60 | .word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask | 60 | .word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask |
61 | /*200*/ .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir | 61 | /*200*/ .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir |
62 | .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64 | 62 | .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64 |
@@ -95,7 +95,7 @@ sys_call_table: | |||
95 | /*0*/ .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write | 95 | /*0*/ .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write |
96 | /*5*/ .word sys_open, sys_close, sys_wait4, sys_creat, sys_link | 96 | /*5*/ .word sys_open, sys_close, sys_wait4, sys_creat, sys_link |
97 | /*10*/ .word sys_unlink, sys_nis_syscall, sys_chdir, sys_chown, sys_mknod | 97 | /*10*/ .word sys_unlink, sys_nis_syscall, sys_chdir, sys_chown, sys_mknod |
98 | /*15*/ .word sys_chmod, sys_lchown, sparc_brk, sys_perfctr, sys_lseek | 98 | /*15*/ .word sys_chmod, sys_lchown, sys_sparc_brk, sys_perfctr, sys_lseek |
99 | /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid, sys_getuid | 99 | /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid, sys_getuid |
100 | /*25*/ .word sys_vmsplice, sys_ptrace, sys_alarm, sys_sigaltstack, sys_nis_syscall | 100 | /*25*/ .word sys_vmsplice, sys_ptrace, sys_alarm, sys_sigaltstack, sys_nis_syscall |
101 | /*30*/ .word sys_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice | 101 | /*30*/ .word sys_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice |
@@ -106,7 +106,7 @@ sys_call_table: | |||
106 | .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve | 106 | .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve |
107 | /*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize | 107 | /*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize |
108 | .word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall | 108 | .word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall |
109 | /*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys64_munmap, sys_mprotect | 109 | /*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys_64_munmap, sys_mprotect |
110 | .word sys_madvise, sys_vhangup, sys_nis_syscall, sys_mincore, sys_getgroups | 110 | .word sys_madvise, sys_vhangup, sys_nis_syscall, sys_mincore, sys_getgroups |
111 | /*80*/ .word sys_setgroups, sys_getpgrp, sys_nis_syscall, sys_setitimer, sys_nis_syscall | 111 | /*80*/ .word sys_setgroups, sys_getpgrp, sys_nis_syscall, sys_setitimer, sys_nis_syscall |
112 | .word sys_swapon, sys_getitimer, sys_nis_syscall, sys_sethostname, sys_nis_syscall | 112 | .word sys_swapon, sys_getitimer, sys_nis_syscall, sys_sethostname, sys_nis_syscall |
@@ -129,8 +129,8 @@ sys_call_table: | |||
129 | /*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents | 129 | /*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents |
130 | .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr | 130 | .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr |
131 | /*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall | 131 | /*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall |
132 | .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sparc64_newuname | 132 | .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_sparc64_newuname |
133 | /*190*/ .word sys_init_module, sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl | 133 | /*190*/ .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl |
134 | .word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask | 134 | .word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask |
135 | /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall | 135 | /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall |
136 | .word sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 | 136 | .word sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 |
@@ -142,7 +142,7 @@ sys_call_table: | |||
142 | .word sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall | 142 | .word sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall |
143 | /*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler | 143 | /*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler |
144 | .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys_sched_rr_get_interval, sys_nanosleep | 144 | .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys_sched_rr_get_interval, sys_nanosleep |
145 | /*250*/ .word sys64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl | 145 | /*250*/ .word sys_64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl |
146 | .word sys_sync_file_range, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep | 146 | .word sys_sync_file_range, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep |
147 | /*260*/ .word sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun | 147 | /*260*/ .word sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun |
148 | .word sys_timer_delete, sys_timer_create, sys_ni_syscall, sys_io_setup, sys_io_destroy | 148 | .word sys_timer_delete, sys_timer_create, sys_ni_syscall, sys_io_setup, sys_io_destroy |
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index c2d153d46586..d809c4ebb48f 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* arch/sparc64/kernel/traps.c | 1 | /* arch/sparc64/kernel/traps.c |
2 | * | 2 | * |
3 | * Copyright (C) 1995,1997,2008 David S. Miller (davem@davemloft.net) | 3 | * Copyright (C) 1995,1997,2008,2009 David S. Miller (davem@davemloft.net) |
4 | * Copyright (C) 1997,1999,2000 Jakub Jelinek (jakub@redhat.com) | 4 | * Copyright (C) 1997,1999,2000 Jakub Jelinek (jakub@redhat.com) |
5 | */ | 5 | */ |
6 | 6 | ||
@@ -314,6 +314,21 @@ void sun4v_data_access_exception(struct pt_regs *regs, unsigned long addr, unsig | |||
314 | return; | 314 | return; |
315 | 315 | ||
316 | if (regs->tstate & TSTATE_PRIV) { | 316 | if (regs->tstate & TSTATE_PRIV) { |
317 | /* Test if this comes from uaccess places. */ | ||
318 | const struct exception_table_entry *entry; | ||
319 | |||
320 | entry = search_exception_tables(regs->tpc); | ||
321 | if (entry) { | ||
322 | /* Ouch, somebody is trying VM hole tricks on us... */ | ||
323 | #ifdef DEBUG_EXCEPTIONS | ||
324 | printk("Exception: PC<%016lx> faddr<UNKNOWN>\n", regs->tpc); | ||
325 | printk("EX_TABLE: insn<%016lx> fixup<%016lx>\n", | ||
326 | regs->tpc, entry->fixup); | ||
327 | #endif | ||
328 | regs->tpc = entry->fixup; | ||
329 | regs->tnpc = regs->tpc + 4; | ||
330 | return; | ||
331 | } | ||
317 | printk("sun4v_data_access_exception: ADDR[%016lx] " | 332 | printk("sun4v_data_access_exception: ADDR[%016lx] " |
318 | "CTX[%04x] TYPE[%04x], going.\n", | 333 | "CTX[%04x] TYPE[%04x], going.\n", |
319 | addr, ctx, type); | 334 | addr, ctx, type); |
diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile index 273fc85269fc..e75faf0e59ae 100644 --- a/arch/sparc/lib/Makefile +++ b/arch/sparc/lib/Makefile | |||
@@ -18,7 +18,7 @@ lib-$(CONFIG_SPARC32) += lshrdi3.o ashldi3.o | |||
18 | lib-y += rwsem_$(BITS).o | 18 | lib-y += rwsem_$(BITS).o |
19 | lib-$(CONFIG_SPARC32) += muldi3.o bitext.o cmpdi2.o | 19 | lib-$(CONFIG_SPARC32) += muldi3.o bitext.o cmpdi2.o |
20 | 20 | ||
21 | lib-$(CONFIG_SPARC64) += PeeCeeI.o copy_page.o clear_page.o bzero.o | 21 | lib-$(CONFIG_SPARC64) += copy_page.o clear_page.o bzero.o |
22 | lib-$(CONFIG_SPARC64) += csum_copy.o csum_copy_from_user.o csum_copy_to_user.o | 22 | lib-$(CONFIG_SPARC64) += csum_copy.o csum_copy_from_user.o csum_copy_to_user.o |
23 | lib-$(CONFIG_SPARC64) += VISsave.o | 23 | lib-$(CONFIG_SPARC64) += VISsave.o |
24 | lib-$(CONFIG_SPARC64) += bitops.o | 24 | lib-$(CONFIG_SPARC64) += bitops.o |
@@ -43,3 +43,4 @@ lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o | |||
43 | obj-y += iomap.o | 43 | obj-y += iomap.o |
44 | obj-$(CONFIG_SPARC32) += atomic32.o | 44 | obj-$(CONFIG_SPARC32) += atomic32.o |
45 | obj-y += ksyms.o | 45 | obj-y += ksyms.o |
46 | obj-$(CONFIG_SPARC64) += PeeCeeI.o | ||