diff options
-rw-r--r-- | arch/sparc/kernel/sys_sparc.c | 48 | ||||
-rw-r--r-- | arch/sparc64/kernel/rtrap.S | 6 | ||||
-rw-r--r-- | arch/sparc64/kernel/signal.c | 21 | ||||
-rw-r--r-- | arch/sparc64/kernel/signal32.c | 13 | ||||
-rw-r--r-- | arch/sparc64/kernel/sys_sparc.c | 36 | ||||
-rw-r--r-- | arch/sparc64/kernel/sys_sparc32.c | 33 | ||||
-rw-r--r-- | include/asm-sparc/mman.h | 5 | ||||
-rw-r--r-- | include/asm-sparc64/mman.h | 5 | ||||
-rw-r--r-- | include/asm-sparc64/thread_info.h | 28 | ||||
-rw-r--r-- | lib/lmb.c | 45 |
10 files changed, 89 insertions, 151 deletions
diff --git a/arch/sparc/kernel/sys_sparc.c b/arch/sparc/kernel/sys_sparc.c index e995491c4436..3c6b49a53ae8 100644 --- a/arch/sparc/kernel/sys_sparc.c +++ b/arch/sparc/kernel/sys_sparc.c | |||
@@ -219,7 +219,7 @@ out: | |||
219 | return err; | 219 | return err; |
220 | } | 220 | } |
221 | 221 | ||
222 | int sparc_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) | 222 | int sparc_mmap_check(unsigned long addr, unsigned long len) |
223 | { | 223 | { |
224 | if (ARCH_SUN4C_SUN4 && | 224 | if (ARCH_SUN4C_SUN4 && |
225 | (len > 0x20000000 || | 225 | (len > 0x20000000 || |
@@ -295,52 +295,14 @@ asmlinkage unsigned long sparc_mremap(unsigned long addr, | |||
295 | unsigned long old_len, unsigned long new_len, | 295 | unsigned long old_len, unsigned long new_len, |
296 | unsigned long flags, unsigned long new_addr) | 296 | unsigned long flags, unsigned long new_addr) |
297 | { | 297 | { |
298 | struct vm_area_struct *vma; | ||
299 | unsigned long ret = -EINVAL; | 298 | unsigned long ret = -EINVAL; |
300 | if (ARCH_SUN4C_SUN4) { | 299 | |
301 | if (old_len > 0x20000000 || new_len > 0x20000000) | 300 | if (unlikely(sparc_mmap_check(addr, old_len))) |
302 | goto out; | 301 | goto out; |
303 | if (addr < 0xe0000000 && addr + old_len > 0x20000000) | 302 | if (unlikely(sparc_mmap_check(new_addr, new_len))) |
304 | goto out; | ||
305 | } | ||
306 | if (old_len > TASK_SIZE - PAGE_SIZE || | ||
307 | new_len > TASK_SIZE - PAGE_SIZE) | ||
308 | goto out; | 303 | goto out; |
309 | down_write(¤t->mm->mmap_sem); | 304 | down_write(¤t->mm->mmap_sem); |
310 | if (flags & MREMAP_FIXED) { | ||
311 | if (ARCH_SUN4C_SUN4 && | ||
312 | new_addr < 0xe0000000 && | ||
313 | new_addr + new_len > 0x20000000) | ||
314 | goto out_sem; | ||
315 | if (new_addr + new_len > TASK_SIZE - PAGE_SIZE) | ||
316 | goto out_sem; | ||
317 | } else if ((ARCH_SUN4C_SUN4 && addr < 0xe0000000 && | ||
318 | addr + new_len > 0x20000000) || | ||
319 | addr + new_len > TASK_SIZE - PAGE_SIZE) { | ||
320 | unsigned long map_flags = 0; | ||
321 | struct file *file = NULL; | ||
322 | |||
323 | ret = -ENOMEM; | ||
324 | if (!(flags & MREMAP_MAYMOVE)) | ||
325 | goto out_sem; | ||
326 | |||
327 | vma = find_vma(current->mm, addr); | ||
328 | if (vma) { | ||
329 | if (vma->vm_flags & VM_SHARED) | ||
330 | map_flags |= MAP_SHARED; | ||
331 | file = vma->vm_file; | ||
332 | } | ||
333 | |||
334 | new_addr = get_unmapped_area(file, addr, new_len, | ||
335 | vma ? vma->vm_pgoff : 0, | ||
336 | map_flags); | ||
337 | ret = new_addr; | ||
338 | if (new_addr & ~PAGE_MASK) | ||
339 | goto out_sem; | ||
340 | flags |= MREMAP_FIXED; | ||
341 | } | ||
342 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | 305 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
343 | out_sem: | ||
344 | up_write(¤t->mm->mmap_sem); | 306 | up_write(¤t->mm->mmap_sem); |
345 | out: | 307 | out: |
346 | return ret; | 308 | return ret; |
diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S index b9b785fd8b46..16689b2930db 100644 --- a/arch/sparc64/kernel/rtrap.S +++ b/arch/sparc64/kernel/rtrap.S | |||
@@ -46,7 +46,7 @@ __handle_user_windows: | |||
46 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate | 46 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate |
47 | ldx [%g6 + TI_FLAGS], %l0 | 47 | ldx [%g6 + TI_FLAGS], %l0 |
48 | 48 | ||
49 | 1: andcc %l0, (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), %g0 | 49 | 1: andcc %l0, _TIF_SIGPENDING, %g0 |
50 | be,pt %xcc, __handle_user_windows_continue | 50 | be,pt %xcc, __handle_user_windows_continue |
51 | nop | 51 | nop |
52 | mov %l5, %o1 | 52 | mov %l5, %o1 |
@@ -86,7 +86,7 @@ __handle_perfctrs: | |||
86 | wrpr %g0, RTRAP_PSTATE, %pstate | 86 | wrpr %g0, RTRAP_PSTATE, %pstate |
87 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate | 87 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate |
88 | ldx [%g6 + TI_FLAGS], %l0 | 88 | ldx [%g6 + TI_FLAGS], %l0 |
89 | 1: andcc %l0, (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), %g0 | 89 | 1: andcc %l0, _TIF_SIGPENDING, %g0 |
90 | 90 | ||
91 | be,pt %xcc, __handle_perfctrs_continue | 91 | be,pt %xcc, __handle_perfctrs_continue |
92 | sethi %hi(TSTATE_PEF), %o0 | 92 | sethi %hi(TSTATE_PEF), %o0 |
@@ -195,7 +195,7 @@ __handle_preemption_continue: | |||
195 | andcc %l1, %o0, %g0 | 195 | andcc %l1, %o0, %g0 |
196 | andcc %l0, _TIF_NEED_RESCHED, %g0 | 196 | andcc %l0, _TIF_NEED_RESCHED, %g0 |
197 | bne,pn %xcc, __handle_preemption | 197 | bne,pn %xcc, __handle_preemption |
198 | andcc %l0, (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), %g0 | 198 | andcc %l0, _TIF_SIGPENDING, %g0 |
199 | bne,pn %xcc, __handle_signal | 199 | bne,pn %xcc, __handle_signal |
200 | __handle_signal_continue: | 200 | __handle_signal_continue: |
201 | ldub [%g6 + TI_WSAVED], %o2 | 201 | ldub [%g6 + TI_WSAVED], %o2 |
diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c index 2378482c2aab..6e4dc67d16af 100644 --- a/arch/sparc64/kernel/signal.c +++ b/arch/sparc64/kernel/signal.c | |||
@@ -247,7 +247,9 @@ static long _sigpause_common(old_sigset_t set) | |||
247 | 247 | ||
248 | current->state = TASK_INTERRUPTIBLE; | 248 | current->state = TASK_INTERRUPTIBLE; |
249 | schedule(); | 249 | schedule(); |
250 | set_thread_flag(TIF_RESTORE_SIGMASK); | 250 | |
251 | set_restore_sigmask(); | ||
252 | |||
251 | return -ERESTARTNOHAND; | 253 | return -ERESTARTNOHAND; |
252 | } | 254 | } |
253 | 255 | ||
@@ -537,7 +539,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
537 | } else | 539 | } else |
538 | restart_syscall = 0; | 540 | restart_syscall = 0; |
539 | 541 | ||
540 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 542 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) |
541 | oldset = ¤t->saved_sigmask; | 543 | oldset = ¤t->saved_sigmask; |
542 | else | 544 | else |
543 | oldset = ¤t->blocked; | 545 | oldset = ¤t->blocked; |
@@ -566,13 +568,12 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
566 | syscall_restart(orig_i0, regs, &ka.sa); | 568 | syscall_restart(orig_i0, regs, &ka.sa); |
567 | handle_signal(signr, &ka, &info, oldset, regs); | 569 | handle_signal(signr, &ka, &info, oldset, regs); |
568 | 570 | ||
569 | /* a signal was successfully delivered; the saved | 571 | /* A signal was successfully delivered; the saved |
570 | * sigmask will have been stored in the signal frame, | 572 | * sigmask will have been stored in the signal frame, |
571 | * and will be restored by sigreturn, so we can simply | 573 | * and will be restored by sigreturn, so we can simply |
572 | * clear the TIF_RESTORE_SIGMASK flag. | 574 | * clear the TS_RESTORE_SIGMASK flag. |
573 | */ | 575 | */ |
574 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 576 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
575 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
576 | return; | 577 | return; |
577 | } | 578 | } |
578 | if (restart_syscall && | 579 | if (restart_syscall && |
@@ -591,17 +592,17 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
591 | regs->tnpc -= 4; | 592 | regs->tnpc -= 4; |
592 | } | 593 | } |
593 | 594 | ||
594 | /* if there's no signal to deliver, we just put the saved sigmask | 595 | /* If there's no signal to deliver, we just put the saved sigmask |
595 | * back | 596 | * back |
596 | */ | 597 | */ |
597 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 598 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
598 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 599 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
599 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 600 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
600 | } | 601 | } |
601 | } | 602 | } |
602 | 603 | ||
603 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) | 604 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) |
604 | { | 605 | { |
605 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 606 | if (thread_info_flags & _TIF_SIGPENDING) |
606 | do_signal(regs, orig_i0); | 607 | do_signal(regs, orig_i0); |
607 | } | 608 | } |
diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c index 3f19e9af3d1b..97cdd1bf4a10 100644 --- a/arch/sparc64/kernel/signal32.c +++ b/arch/sparc64/kernel/signal32.c | |||
@@ -788,13 +788,12 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs, | |||
788 | syscall_restart32(orig_i0, regs, &ka.sa); | 788 | syscall_restart32(orig_i0, regs, &ka.sa); |
789 | handle_signal32(signr, &ka, &info, oldset, regs); | 789 | handle_signal32(signr, &ka, &info, oldset, regs); |
790 | 790 | ||
791 | /* a signal was successfully delivered; the saved | 791 | /* A signal was successfully delivered; the saved |
792 | * sigmask will have been stored in the signal frame, | 792 | * sigmask will have been stored in the signal frame, |
793 | * and will be restored by sigreturn, so we can simply | 793 | * and will be restored by sigreturn, so we can simply |
794 | * clear the TIF_RESTORE_SIGMASK flag. | 794 | * clear the TS_RESTORE_SIGMASK flag. |
795 | */ | 795 | */ |
796 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 796 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
797 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
798 | return; | 797 | return; |
799 | } | 798 | } |
800 | if (restart_syscall && | 799 | if (restart_syscall && |
@@ -813,11 +812,11 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs, | |||
813 | regs->tnpc -= 4; | 812 | regs->tnpc -= 4; |
814 | } | 813 | } |
815 | 814 | ||
816 | /* if there's no signal to deliver, we just put the saved sigmask | 815 | /* If there's no signal to deliver, we just put the saved sigmask |
817 | * back | 816 | * back |
818 | */ | 817 | */ |
819 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 818 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
820 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 819 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
821 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 820 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
822 | } | 821 | } |
823 | } | 822 | } |
diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index 0dbc941f130e..ac1bff58c1ac 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c | |||
@@ -542,8 +542,7 @@ asmlinkage long sparc64_personality(unsigned long personality) | |||
542 | return ret; | 542 | return ret; |
543 | } | 543 | } |
544 | 544 | ||
545 | int sparc64_mmap_check(unsigned long addr, unsigned long len, | 545 | int sparc64_mmap_check(unsigned long addr, unsigned long len) |
546 | unsigned long flags) | ||
547 | { | 546 | { |
548 | if (test_thread_flag(TIF_32BIT)) { | 547 | if (test_thread_flag(TIF_32BIT)) { |
549 | if (len >= STACK_TOP32) | 548 | if (len >= STACK_TOP32) |
@@ -609,46 +608,19 @@ asmlinkage unsigned long sys64_mremap(unsigned long addr, | |||
609 | unsigned long old_len, unsigned long new_len, | 608 | unsigned long old_len, unsigned long new_len, |
610 | unsigned long flags, unsigned long new_addr) | 609 | unsigned long flags, unsigned long new_addr) |
611 | { | 610 | { |
612 | struct vm_area_struct *vma; | ||
613 | unsigned long ret = -EINVAL; | 611 | unsigned long ret = -EINVAL; |
614 | 612 | ||
615 | if (test_thread_flag(TIF_32BIT)) | 613 | if (test_thread_flag(TIF_32BIT)) |
616 | goto out; | 614 | goto out; |
617 | if (unlikely(new_len >= VA_EXCLUDE_START)) | 615 | if (unlikely(new_len >= VA_EXCLUDE_START)) |
618 | goto out; | 616 | goto out; |
619 | if (unlikely(invalid_64bit_range(addr, old_len))) | 617 | if (unlikely(sparc64_mmap_check(addr, old_len))) |
618 | goto out; | ||
619 | if (unlikely(sparc64_mmap_check(new_addr, new_len))) | ||
620 | goto out; | 620 | goto out; |
621 | 621 | ||
622 | down_write(¤t->mm->mmap_sem); | 622 | down_write(¤t->mm->mmap_sem); |
623 | if (flags & MREMAP_FIXED) { | ||
624 | if (invalid_64bit_range(new_addr, new_len)) | ||
625 | goto out_sem; | ||
626 | } else if (invalid_64bit_range(addr, new_len)) { | ||
627 | unsigned long map_flags = 0; | ||
628 | struct file *file = NULL; | ||
629 | |||
630 | ret = -ENOMEM; | ||
631 | if (!(flags & MREMAP_MAYMOVE)) | ||
632 | goto out_sem; | ||
633 | |||
634 | vma = find_vma(current->mm, addr); | ||
635 | if (vma) { | ||
636 | if (vma->vm_flags & VM_SHARED) | ||
637 | map_flags |= MAP_SHARED; | ||
638 | file = vma->vm_file; | ||
639 | } | ||
640 | |||
641 | /* MREMAP_FIXED checked above. */ | ||
642 | new_addr = get_unmapped_area(file, addr, new_len, | ||
643 | vma ? vma->vm_pgoff : 0, | ||
644 | map_flags); | ||
645 | ret = new_addr; | ||
646 | if (new_addr & ~PAGE_MASK) | ||
647 | goto out_sem; | ||
648 | flags |= MREMAP_FIXED; | ||
649 | } | ||
650 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | 623 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
651 | out_sem: | ||
652 | up_write(¤t->mm->mmap_sem); | 624 | up_write(¤t->mm->mmap_sem); |
653 | out: | 625 | out: |
654 | return ret; | 626 | return ret; |
diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index 1aa4288125f2..ba5bd626b39e 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c | |||
@@ -867,44 +867,15 @@ asmlinkage unsigned long sys32_mremap(unsigned long addr, | |||
867 | unsigned long old_len, unsigned long new_len, | 867 | unsigned long old_len, unsigned long new_len, |
868 | unsigned long flags, u32 __new_addr) | 868 | unsigned long flags, u32 __new_addr) |
869 | { | 869 | { |
870 | struct vm_area_struct *vma; | ||
871 | unsigned long ret = -EINVAL; | 870 | unsigned long ret = -EINVAL; |
872 | unsigned long new_addr = __new_addr; | 871 | unsigned long new_addr = __new_addr; |
873 | 872 | ||
874 | if (old_len > STACK_TOP32 || new_len > STACK_TOP32) | 873 | if (unlikely(sparc64_mmap_check(addr, old_len))) |
875 | goto out; | 874 | goto out; |
876 | if (addr > STACK_TOP32 - old_len) | 875 | if (unlikely(sparc64_mmap_check(new_addr, new_len))) |
877 | goto out; | 876 | goto out; |
878 | down_write(¤t->mm->mmap_sem); | 877 | down_write(¤t->mm->mmap_sem); |
879 | if (flags & MREMAP_FIXED) { | ||
880 | if (new_addr > STACK_TOP32 - new_len) | ||
881 | goto out_sem; | ||
882 | } else if (addr > STACK_TOP32 - new_len) { | ||
883 | unsigned long map_flags = 0; | ||
884 | struct file *file = NULL; | ||
885 | |||
886 | ret = -ENOMEM; | ||
887 | if (!(flags & MREMAP_MAYMOVE)) | ||
888 | goto out_sem; | ||
889 | |||
890 | vma = find_vma(current->mm, addr); | ||
891 | if (vma) { | ||
892 | if (vma->vm_flags & VM_SHARED) | ||
893 | map_flags |= MAP_SHARED; | ||
894 | file = vma->vm_file; | ||
895 | } | ||
896 | |||
897 | /* MREMAP_FIXED checked above. */ | ||
898 | new_addr = get_unmapped_area(file, addr, new_len, | ||
899 | vma ? vma->vm_pgoff : 0, | ||
900 | map_flags); | ||
901 | ret = new_addr; | ||
902 | if (new_addr & ~PAGE_MASK) | ||
903 | goto out_sem; | ||
904 | flags |= MREMAP_FIXED; | ||
905 | } | ||
906 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | 878 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
907 | out_sem: | ||
908 | up_write(¤t->mm->mmap_sem); | 879 | up_write(¤t->mm->mmap_sem); |
909 | out: | 880 | out: |
910 | return ret; | 881 | return ret; |
diff --git a/include/asm-sparc/mman.h b/include/asm-sparc/mman.h index e18be984c01d..3d16b40bb8ef 100644 --- a/include/asm-sparc/mman.h +++ b/include/asm-sparc/mman.h | |||
@@ -24,9 +24,8 @@ | |||
24 | 24 | ||
25 | #ifdef __KERNEL__ | 25 | #ifdef __KERNEL__ |
26 | #ifndef __ASSEMBLY__ | 26 | #ifndef __ASSEMBLY__ |
27 | #define arch_mmap_check sparc_mmap_check | 27 | #define arch_mmap_check(addr,len,flags) sparc_mmap_check(addr,len) |
28 | int sparc_mmap_check(unsigned long addr, unsigned long len, | 28 | int sparc_mmap_check(unsigned long addr, unsigned long len); |
29 | unsigned long flags); | ||
30 | #endif | 29 | #endif |
31 | #endif | 30 | #endif |
32 | 31 | ||
diff --git a/include/asm-sparc64/mman.h b/include/asm-sparc64/mman.h index e584563b56eb..625be4d61baf 100644 --- a/include/asm-sparc64/mman.h +++ b/include/asm-sparc64/mman.h | |||
@@ -24,9 +24,8 @@ | |||
24 | 24 | ||
25 | #ifdef __KERNEL__ | 25 | #ifdef __KERNEL__ |
26 | #ifndef __ASSEMBLY__ | 26 | #ifndef __ASSEMBLY__ |
27 | #define arch_mmap_check sparc64_mmap_check | 27 | #define arch_mmap_check(addr,len,flags) sparc64_mmap_check(addr,len) |
28 | int sparc64_mmap_check(unsigned long addr, unsigned long len, | 28 | int sparc64_mmap_check(unsigned long addr, unsigned long len); |
29 | unsigned long flags); | ||
30 | #endif | 29 | #endif |
31 | #endif | 30 | #endif |
32 | 31 | ||
diff --git a/include/asm-sparc64/thread_info.h b/include/asm-sparc64/thread_info.h index 71e42d1a80d9..e5873e385306 100644 --- a/include/asm-sparc64/thread_info.h +++ b/include/asm-sparc64/thread_info.h | |||
@@ -38,7 +38,7 @@ struct thread_info { | |||
38 | struct task_struct *task; | 38 | struct task_struct *task; |
39 | unsigned long flags; | 39 | unsigned long flags; |
40 | __u8 fpsaved[7]; | 40 | __u8 fpsaved[7]; |
41 | __u8 pad; | 41 | __u8 status; |
42 | unsigned long ksp; | 42 | unsigned long ksp; |
43 | 43 | ||
44 | /* D$ line 2 */ | 44 | /* D$ line 2 */ |
@@ -217,7 +217,7 @@ register struct thread_info *current_thread_info_reg asm("g6"); | |||
217 | * nop | 217 | * nop |
218 | */ | 218 | */ |
219 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ | 219 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ |
220 | #define TIF_RESTORE_SIGMASK 1 /* restore signal mask in do_signal() */ | 220 | /* flags bit 1 is available */ |
221 | #define TIF_SIGPENDING 2 /* signal pending */ | 221 | #define TIF_SIGPENDING 2 /* signal pending */ |
222 | #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ | 222 | #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ |
223 | #define TIF_PERFCTR 4 /* performance counters active */ | 223 | #define TIF_PERFCTR 4 /* performance counters active */ |
@@ -244,14 +244,34 @@ register struct thread_info *current_thread_info_reg asm("g6"); | |||
244 | #define _TIF_32BIT (1<<TIF_32BIT) | 244 | #define _TIF_32BIT (1<<TIF_32BIT) |
245 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) | 245 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) |
246 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) | 246 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) |
247 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | ||
248 | #define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING) | 247 | #define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING) |
249 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 248 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
250 | 249 | ||
251 | #define _TIF_USER_WORK_MASK ((0xff << TI_FLAG_WSAVED_SHIFT) | \ | 250 | #define _TIF_USER_WORK_MASK ((0xff << TI_FLAG_WSAVED_SHIFT) | \ |
252 | (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | \ | 251 | (_TIF_SIGPENDING | \ |
253 | _TIF_NEED_RESCHED | _TIF_PERFCTR)) | 252 | _TIF_NEED_RESCHED | _TIF_PERFCTR)) |
254 | 253 | ||
254 | /* | ||
255 | * Thread-synchronous status. | ||
256 | * | ||
257 | * This is different from the flags in that nobody else | ||
258 | * ever touches our thread-synchronous status, so we don't | ||
259 | * have to worry about atomic accesses. | ||
260 | * | ||
261 | * Note that there are only 8 bits available. | ||
262 | */ | ||
263 | #define TS_RESTORE_SIGMASK 0x0001 /* restore signal mask in do_signal() */ | ||
264 | |||
265 | #ifndef __ASSEMBLY__ | ||
266 | #define HAVE_SET_RESTORE_SIGMASK 1 | ||
267 | static inline void set_restore_sigmask(void) | ||
268 | { | ||
269 | struct thread_info *ti = current_thread_info(); | ||
270 | ti->status |= TS_RESTORE_SIGMASK; | ||
271 | set_bit(TIF_SIGPENDING, &ti->flags); | ||
272 | } | ||
273 | #endif /* !__ASSEMBLY__ */ | ||
274 | |||
255 | #endif /* __KERNEL__ */ | 275 | #endif /* __KERNEL__ */ |
256 | 276 | ||
257 | #endif /* _ASM_THREAD_INFO_H */ | 277 | #endif /* _ASM_THREAD_INFO_H */ |
@@ -19,31 +19,42 @@ | |||
19 | 19 | ||
20 | struct lmb lmb; | 20 | struct lmb lmb; |
21 | 21 | ||
22 | static int lmb_debug; | ||
23 | |||
24 | static int __init early_lmb(char *p) | ||
25 | { | ||
26 | if (p && strstr(p, "debug")) | ||
27 | lmb_debug = 1; | ||
28 | return 0; | ||
29 | } | ||
30 | early_param("lmb", early_lmb); | ||
31 | |||
22 | void lmb_dump_all(void) | 32 | void lmb_dump_all(void) |
23 | { | 33 | { |
24 | #ifdef DEBUG | ||
25 | unsigned long i; | 34 | unsigned long i; |
26 | 35 | ||
27 | pr_debug("lmb_dump_all:\n"); | 36 | if (!lmb_debug) |
28 | pr_debug(" memory.cnt = 0x%lx\n", lmb.memory.cnt); | 37 | return; |
29 | pr_debug(" memory.size = 0x%llx\n", | 38 | |
39 | pr_info("lmb_dump_all:\n"); | ||
40 | pr_info(" memory.cnt = 0x%lx\n", lmb.memory.cnt); | ||
41 | pr_info(" memory.size = 0x%llx\n", | ||
30 | (unsigned long long)lmb.memory.size); | 42 | (unsigned long long)lmb.memory.size); |
31 | for (i=0; i < lmb.memory.cnt ;i++) { | 43 | for (i=0; i < lmb.memory.cnt ;i++) { |
32 | pr_debug(" memory.region[0x%x].base = 0x%llx\n", | 44 | pr_info(" memory.region[0x%lx].base = 0x%llx\n", |
33 | i, (unsigned long long)lmb.memory.region[i].base); | 45 | i, (unsigned long long)lmb.memory.region[i].base); |
34 | pr_debug(" .size = 0x%llx\n", | 46 | pr_info(" .size = 0x%llx\n", |
35 | (unsigned long long)lmb.memory.region[i].size); | 47 | (unsigned long long)lmb.memory.region[i].size); |
36 | } | 48 | } |
37 | 49 | ||
38 | pr_debug(" reserved.cnt = 0x%lx\n", lmb.reserved.cnt); | 50 | pr_info(" reserved.cnt = 0x%lx\n", lmb.reserved.cnt); |
39 | pr_debug(" reserved.size = 0x%lx\n", lmb.reserved.size); | 51 | pr_info(" reserved.size = 0x%lx\n", lmb.reserved.size); |
40 | for (i=0; i < lmb.reserved.cnt ;i++) { | 52 | for (i=0; i < lmb.reserved.cnt ;i++) { |
41 | pr_debug(" reserved.region[0x%x].base = 0x%llx\n", | 53 | pr_info(" reserved.region[0x%lx].base = 0x%llx\n", |
42 | i, (unsigned long long)lmb.reserved.region[i].base); | 54 | i, (unsigned long long)lmb.reserved.region[i].base); |
43 | pr_debug(" .size = 0x%llx\n", | 55 | pr_info(" .size = 0x%llx\n", |
44 | (unsigned long long)lmb.reserved.region[i].size); | 56 | (unsigned long long)lmb.reserved.region[i].size); |
45 | } | 57 | } |
46 | #endif /* DEBUG */ | ||
47 | } | 58 | } |
48 | 59 | ||
49 | static unsigned long lmb_addrs_overlap(u64 base1, u64 size1, u64 base2, | 60 | static unsigned long lmb_addrs_overlap(u64 base1, u64 size1, u64 base2, |
@@ -286,8 +297,7 @@ static u64 __init lmb_alloc_nid_unreserved(u64 start, u64 end, | |||
286 | j = lmb_overlaps_region(&lmb.reserved, base, size); | 297 | j = lmb_overlaps_region(&lmb.reserved, base, size); |
287 | if (j < 0) { | 298 | if (j < 0) { |
288 | /* this area isn't reserved, take it */ | 299 | /* this area isn't reserved, take it */ |
289 | if (lmb_add_region(&lmb.reserved, base, | 300 | if (lmb_add_region(&lmb.reserved, base, size) < 0) |
290 | lmb_align_up(size, align)) < 0) | ||
291 | base = ~(u64)0; | 301 | base = ~(u64)0; |
292 | return base; | 302 | return base; |
293 | } | 303 | } |
@@ -333,6 +343,10 @@ u64 __init lmb_alloc_nid(u64 size, u64 align, int nid, | |||
333 | struct lmb_region *mem = &lmb.memory; | 343 | struct lmb_region *mem = &lmb.memory; |
334 | int i; | 344 | int i; |
335 | 345 | ||
346 | BUG_ON(0 == size); | ||
347 | |||
348 | size = lmb_align_up(size, align); | ||
349 | |||
336 | for (i = 0; i < mem->cnt; i++) { | 350 | for (i = 0; i < mem->cnt; i++) { |
337 | u64 ret = lmb_alloc_nid_region(&mem->region[i], | 351 | u64 ret = lmb_alloc_nid_region(&mem->region[i], |
338 | nid_range, | 352 | nid_range, |
@@ -370,6 +384,8 @@ u64 __init __lmb_alloc_base(u64 size, u64 align, u64 max_addr) | |||
370 | 384 | ||
371 | BUG_ON(0 == size); | 385 | BUG_ON(0 == size); |
372 | 386 | ||
387 | size = lmb_align_up(size, align); | ||
388 | |||
373 | /* On some platforms, make sure we allocate lowmem */ | 389 | /* On some platforms, make sure we allocate lowmem */ |
374 | /* Note that LMB_REAL_LIMIT may be LMB_ALLOC_ANYWHERE */ | 390 | /* Note that LMB_REAL_LIMIT may be LMB_ALLOC_ANYWHERE */ |
375 | if (max_addr == LMB_ALLOC_ANYWHERE) | 391 | if (max_addr == LMB_ALLOC_ANYWHERE) |
@@ -393,8 +409,7 @@ u64 __init __lmb_alloc_base(u64 size, u64 align, u64 max_addr) | |||
393 | j = lmb_overlaps_region(&lmb.reserved, base, size); | 409 | j = lmb_overlaps_region(&lmb.reserved, base, size); |
394 | if (j < 0) { | 410 | if (j < 0) { |
395 | /* this area isn't reserved, take it */ | 411 | /* this area isn't reserved, take it */ |
396 | if (lmb_add_region(&lmb.reserved, base, | 412 | if (lmb_add_region(&lmb.reserved, base, size) < 0) |
397 | lmb_align_up(size, align)) < 0) | ||
398 | return 0; | 413 | return 0; |
399 | return base; | 414 | return base; |
400 | } | 415 | } |