diff options
Diffstat (limited to 'arch/sparc64/kernel')
| -rw-r--r-- | arch/sparc64/kernel/entry.S | 42 | ||||
| -rw-r--r-- | arch/sparc64/kernel/power.c | 3 | ||||
| -rw-r--r-- | arch/sparc64/kernel/ptrace.c | 46 | ||||
| -rw-r--r-- | arch/sparc64/kernel/smp.c | 10 | ||||
| -rw-r--r-- | arch/sparc64/kernel/sparc64_ksyms.c | 2 | ||||
| -rw-r--r-- | arch/sparc64/kernel/sys32.S | 2 | ||||
| -rw-r--r-- | arch/sparc64/kernel/systbls.S | 8 | ||||
| -rw-r--r-- | arch/sparc64/kernel/time.c | 24 | ||||
| -rw-r--r-- | arch/sparc64/kernel/vmlinux.lds.S | 2 |
9 files changed, 73 insertions, 66 deletions
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index d3973d8a7195..d781f10adc52 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
| @@ -22,8 +22,6 @@ | |||
| 22 | #include <asm/estate.h> | 22 | #include <asm/estate.h> |
| 23 | #include <asm/auxio.h> | 23 | #include <asm/auxio.h> |
| 24 | 24 | ||
| 25 | /* #define SYSCALL_TRACING 1 */ | ||
| 26 | |||
| 27 | #define curptr g6 | 25 | #define curptr g6 |
| 28 | 26 | ||
| 29 | #define NR_SYSCALLS 284 /* Each OS is different... */ | 27 | #define NR_SYSCALLS 284 /* Each OS is different... */ |
| @@ -1554,11 +1552,12 @@ sys_ptrace: add %sp, PTREGS_OFF, %o0 | |||
| 1554 | nop | 1552 | nop |
| 1555 | .align 32 | 1553 | .align 32 |
| 1556 | 1: ldx [%curptr + TI_FLAGS], %l5 | 1554 | 1: ldx [%curptr + TI_FLAGS], %l5 |
| 1557 | andcc %l5, _TIF_SYSCALL_TRACE, %g0 | 1555 | andcc %l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0 |
| 1558 | be,pt %icc, rtrap | 1556 | be,pt %icc, rtrap |
| 1559 | clr %l6 | 1557 | clr %l6 |
| 1558 | add %sp, PTREGS_OFF, %o0 | ||
| 1560 | call syscall_trace | 1559 | call syscall_trace |
| 1561 | nop | 1560 | mov 1, %o1 |
| 1562 | 1561 | ||
| 1563 | ba,pt %xcc, rtrap | 1562 | ba,pt %xcc, rtrap |
| 1564 | clr %l6 | 1563 | clr %l6 |
| @@ -1642,18 +1641,20 @@ linux_sparc_ni_syscall: | |||
| 1642 | or %l7, %lo(sys_ni_syscall), %l7 | 1641 | or %l7, %lo(sys_ni_syscall), %l7 |
| 1643 | 1642 | ||
| 1644 | linux_syscall_trace32: | 1643 | linux_syscall_trace32: |
| 1644 | add %sp, PTREGS_OFF, %o0 | ||
| 1645 | call syscall_trace | 1645 | call syscall_trace |
| 1646 | nop | 1646 | clr %o1 |
| 1647 | srl %i0, 0, %o0 | 1647 | srl %i0, 0, %o0 |
| 1648 | mov %i4, %o4 | 1648 | srl %i4, 0, %o4 |
| 1649 | srl %i1, 0, %o1 | 1649 | srl %i1, 0, %o1 |
| 1650 | srl %i2, 0, %o2 | 1650 | srl %i2, 0, %o2 |
| 1651 | b,pt %xcc, 2f | 1651 | b,pt %xcc, 2f |
| 1652 | srl %i3, 0, %o3 | 1652 | srl %i3, 0, %o3 |
| 1653 | 1653 | ||
| 1654 | linux_syscall_trace: | 1654 | linux_syscall_trace: |
| 1655 | add %sp, PTREGS_OFF, %o0 | ||
| 1655 | call syscall_trace | 1656 | call syscall_trace |
| 1656 | nop | 1657 | clr %o1 |
| 1657 | mov %i0, %o0 | 1658 | mov %i0, %o0 |
| 1658 | mov %i1, %o1 | 1659 | mov %i1, %o1 |
| 1659 | mov %i2, %o2 | 1660 | mov %i2, %o2 |
| @@ -1671,11 +1672,6 @@ linux_sparc_syscall32: | |||
| 1671 | bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI | 1672 | bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI |
| 1672 | srl %i0, 0, %o0 ! IEU0 | 1673 | srl %i0, 0, %o0 ! IEU0 |
| 1673 | sll %g1, 2, %l4 ! IEU0 Group | 1674 | sll %g1, 2, %l4 ! IEU0 Group |
| 1674 | #ifdef SYSCALL_TRACING | ||
| 1675 | call syscall_trace_entry | ||
| 1676 | add %sp, PTREGS_OFF, %o0 | ||
| 1677 | srl %i0, 0, %o0 | ||
| 1678 | #endif | ||
| 1679 | srl %i4, 0, %o4 ! IEU1 | 1675 | srl %i4, 0, %o4 ! IEU1 |
| 1680 | lduw [%l7 + %l4], %l7 ! Load | 1676 | lduw [%l7 + %l4], %l7 ! Load |
| 1681 | srl %i1, 0, %o1 ! IEU0 Group | 1677 | srl %i1, 0, %o1 ! IEU0 Group |
| @@ -1683,7 +1679,7 @@ linux_sparc_syscall32: | |||
| 1683 | 1679 | ||
| 1684 | srl %i5, 0, %o5 ! IEU1 | 1680 | srl %i5, 0, %o5 ! IEU1 |
| 1685 | srl %i2, 0, %o2 ! IEU0 Group | 1681 | srl %i2, 0, %o2 ! IEU0 Group |
| 1686 | andcc %l0, _TIF_SYSCALL_TRACE, %g0 ! IEU0 Group | 1682 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0 |
| 1687 | bne,pn %icc, linux_syscall_trace32 ! CTI | 1683 | bne,pn %icc, linux_syscall_trace32 ! CTI |
| 1688 | mov %i0, %l5 ! IEU1 | 1684 | mov %i0, %l5 ! IEU1 |
| 1689 | call %l7 ! CTI Group brk forced | 1685 | call %l7 ! CTI Group brk forced |
| @@ -1699,11 +1695,6 @@ linux_sparc_syscall: | |||
| 1699 | bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI | 1695 | bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI |
| 1700 | mov %i0, %o0 ! IEU0 | 1696 | mov %i0, %o0 ! IEU0 |
| 1701 | sll %g1, 2, %l4 ! IEU0 Group | 1697 | sll %g1, 2, %l4 ! IEU0 Group |
| 1702 | #ifdef SYSCALL_TRACING | ||
| 1703 | call syscall_trace_entry | ||
| 1704 | add %sp, PTREGS_OFF, %o0 | ||
| 1705 | mov %i0, %o0 | ||
| 1706 | #endif | ||
| 1707 | mov %i1, %o1 ! IEU1 | 1698 | mov %i1, %o1 ! IEU1 |
| 1708 | lduw [%l7 + %l4], %l7 ! Load | 1699 | lduw [%l7 + %l4], %l7 ! Load |
| 1709 | 4: mov %i2, %o2 ! IEU0 Group | 1700 | 4: mov %i2, %o2 ! IEU0 Group |
| @@ -1711,7 +1702,7 @@ linux_sparc_syscall: | |||
| 1711 | 1702 | ||
| 1712 | mov %i3, %o3 ! IEU1 | 1703 | mov %i3, %o3 ! IEU1 |
| 1713 | mov %i4, %o4 ! IEU0 Group | 1704 | mov %i4, %o4 ! IEU0 Group |
| 1714 | andcc %l0, _TIF_SYSCALL_TRACE, %g0 ! IEU1 Group+1 bubble | 1705 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0 |
| 1715 | bne,pn %icc, linux_syscall_trace ! CTI Group | 1706 | bne,pn %icc, linux_syscall_trace ! CTI Group |
| 1716 | mov %i0, %l5 ! IEU0 | 1707 | mov %i0, %l5 ! IEU0 |
| 1717 | 2: call %l7 ! CTI Group brk forced | 1708 | 2: call %l7 ! CTI Group brk forced |
| @@ -1720,12 +1711,6 @@ linux_sparc_syscall: | |||
| 1720 | 1711 | ||
| 1721 | 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] | 1712 | 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] |
| 1722 | ret_sys_call: | 1713 | ret_sys_call: |
| 1723 | #ifdef SYSCALL_TRACING | ||
| 1724 | mov %o0, %o1 | ||
| 1725 | call syscall_trace_exit | ||
| 1726 | add %sp, PTREGS_OFF, %o0 | ||
| 1727 | mov %o1, %o0 | ||
| 1728 | #endif | ||
| 1729 | ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3 | 1714 | ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3 |
| 1730 | ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc | 1715 | ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc |
| 1731 | sra %o0, 0, %o0 | 1716 | sra %o0, 0, %o0 |
| @@ -1745,7 +1730,7 @@ ret_sys_call: | |||
| 1745 | 1: | 1730 | 1: |
| 1746 | cmp %o0, -ERESTART_RESTARTBLOCK | 1731 | cmp %o0, -ERESTART_RESTARTBLOCK |
| 1747 | bgeu,pn %xcc, 1f | 1732 | bgeu,pn %xcc, 1f |
| 1748 | andcc %l0, _TIF_SYSCALL_TRACE, %l6 | 1733 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %l6 |
| 1749 | 80: | 1734 | 80: |
| 1750 | /* System call success, clear Carry condition code. */ | 1735 | /* System call success, clear Carry condition code. */ |
| 1751 | andn %g3, %g2, %g3 | 1736 | andn %g3, %g2, %g3 |
| @@ -1760,7 +1745,7 @@ ret_sys_call: | |||
| 1760 | /* System call failure, set Carry condition code. | 1745 | /* System call failure, set Carry condition code. |
| 1761 | * Also, get abs(errno) to return to the process. | 1746 | * Also, get abs(errno) to return to the process. |
| 1762 | */ | 1747 | */ |
| 1763 | andcc %l0, _TIF_SYSCALL_TRACE, %l6 | 1748 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %l6 |
| 1764 | sub %g0, %o0, %o0 | 1749 | sub %g0, %o0, %o0 |
| 1765 | or %g3, %g2, %g3 | 1750 | or %g3, %g2, %g3 |
| 1766 | stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] | 1751 | stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] |
| @@ -1773,8 +1758,9 @@ ret_sys_call: | |||
| 1773 | b,pt %xcc, rtrap | 1758 | b,pt %xcc, rtrap |
| 1774 | stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] | 1759 | stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] |
| 1775 | linux_syscall_trace2: | 1760 | linux_syscall_trace2: |
| 1761 | add %sp, PTREGS_OFF, %o0 | ||
| 1776 | call syscall_trace | 1762 | call syscall_trace |
| 1777 | nop | 1763 | mov 1, %o1 |
| 1778 | stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC] | 1764 | stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC] |
| 1779 | ba,pt %xcc, rtrap | 1765 | ba,pt %xcc, rtrap |
| 1780 | stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] | 1766 | stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] |
diff --git a/arch/sparc64/kernel/power.c b/arch/sparc64/kernel/power.c index 52f14e399b1c..533104c7907d 100644 --- a/arch/sparc64/kernel/power.c +++ b/arch/sparc64/kernel/power.c | |||
| @@ -4,6 +4,8 @@ | |||
| 4 | * Copyright (C) 1999 David S. Miller (davem@redhat.com) | 4 | * Copyright (C) 1999 David S. Miller (davem@redhat.com) |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #define __KERNEL_SYSCALLS__ | ||
| 8 | |||
| 7 | #include <linux/config.h> | 9 | #include <linux/config.h> |
| 8 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
| 9 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| @@ -17,7 +19,6 @@ | |||
| 17 | #include <asm/ebus.h> | 19 | #include <asm/ebus.h> |
| 18 | #include <asm/auxio.h> | 20 | #include <asm/auxio.h> |
| 19 | 21 | ||
| 20 | #define __KERNEL_SYSCALLS__ | ||
| 21 | #include <linux/unistd.h> | 22 | #include <linux/unistd.h> |
| 22 | 23 | ||
| 23 | /* | 24 | /* |
diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c index 80a76e2ad732..23ad839d113f 100644 --- a/arch/sparc64/kernel/ptrace.c +++ b/arch/sparc64/kernel/ptrace.c | |||
| @@ -19,6 +19,8 @@ | |||
| 19 | #include <linux/smp.h> | 19 | #include <linux/smp.h> |
| 20 | #include <linux/smp_lock.h> | 20 | #include <linux/smp_lock.h> |
| 21 | #include <linux/security.h> | 21 | #include <linux/security.h> |
| 22 | #include <linux/seccomp.h> | ||
| 23 | #include <linux/audit.h> | ||
| 22 | #include <linux/signal.h> | 24 | #include <linux/signal.h> |
| 23 | 25 | ||
| 24 | #include <asm/asi.h> | 26 | #include <asm/asi.h> |
| @@ -628,15 +630,27 @@ out: | |||
| 628 | unlock_kernel(); | 630 | unlock_kernel(); |
| 629 | } | 631 | } |
| 630 | 632 | ||
| 631 | asmlinkage void syscall_trace(void) | 633 | asmlinkage void syscall_trace(struct pt_regs *regs, int syscall_exit_p) |
| 632 | { | 634 | { |
| 633 | #ifdef DEBUG_PTRACE | 635 | /* do the secure computing check first */ |
| 634 | printk("%s [%d]: syscall_trace\n", current->comm, current->pid); | 636 | secure_computing(regs->u_regs[UREG_G1]); |
| 635 | #endif | 637 | |
| 636 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 638 | if (unlikely(current->audit_context) && syscall_exit_p) { |
| 637 | return; | 639 | unsigned long tstate = regs->tstate; |
| 640 | int result = AUDITSC_SUCCESS; | ||
| 641 | |||
| 642 | if (unlikely(tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) | ||
| 643 | result = AUDITSC_FAILURE; | ||
| 644 | |||
| 645 | audit_syscall_exit(current, result, regs->u_regs[UREG_I0]); | ||
| 646 | } | ||
| 647 | |||
| 638 | if (!(current->ptrace & PT_PTRACED)) | 648 | if (!(current->ptrace & PT_PTRACED)) |
| 639 | return; | 649 | goto out; |
| 650 | |||
| 651 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | ||
| 652 | goto out; | ||
| 653 | |||
| 640 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) | 654 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) |
| 641 | ? 0x80 : 0)); | 655 | ? 0x80 : 0)); |
| 642 | 656 | ||
| @@ -645,12 +659,20 @@ asmlinkage void syscall_trace(void) | |||
| 645 | * for normal use. strace only continues with a signal if the | 659 | * for normal use. strace only continues with a signal if the |
| 646 | * stopping signal is not SIGTRAP. -brl | 660 | * stopping signal is not SIGTRAP. -brl |
| 647 | */ | 661 | */ |
| 648 | #ifdef DEBUG_PTRACE | ||
| 649 | printk("%s [%d]: syscall_trace exit= %x\n", current->comm, | ||
| 650 | current->pid, current->exit_code); | ||
| 651 | #endif | ||
| 652 | if (current->exit_code) { | 662 | if (current->exit_code) { |
| 653 | send_sig (current->exit_code, current, 1); | 663 | send_sig(current->exit_code, current, 1); |
| 654 | current->exit_code = 0; | 664 | current->exit_code = 0; |
| 655 | } | 665 | } |
| 666 | |||
| 667 | out: | ||
| 668 | if (unlikely(current->audit_context) && !syscall_exit_p) | ||
| 669 | audit_syscall_entry(current, | ||
| 670 | (test_thread_flag(TIF_32BIT) ? | ||
| 671 | AUDIT_ARCH_SPARC : | ||
| 672 | AUDIT_ARCH_SPARC64), | ||
| 673 | regs->u_regs[UREG_G1], | ||
| 674 | regs->u_regs[UREG_I0], | ||
| 675 | regs->u_regs[UREG_I1], | ||
| 676 | regs->u_regs[UREG_I2], | ||
| 677 | regs->u_regs[UREG_I3]); | ||
| 656 | } | 678 | } |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index e5b9c7a27789..441fc2e52ce6 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
| @@ -45,8 +45,8 @@ extern void calibrate_delay(void); | |||
| 45 | /* Please don't make this stuff initdata!!! --DaveM */ | 45 | /* Please don't make this stuff initdata!!! --DaveM */ |
| 46 | static unsigned char boot_cpu_id; | 46 | static unsigned char boot_cpu_id; |
| 47 | 47 | ||
| 48 | cpumask_t cpu_online_map = CPU_MASK_NONE; | 48 | cpumask_t cpu_online_map = CPU_MASK_NONE __read_mostly; |
| 49 | cpumask_t phys_cpu_present_map = CPU_MASK_NONE; | 49 | cpumask_t phys_cpu_present_map = CPU_MASK_NONE __read_mostly; |
| 50 | static cpumask_t smp_commenced_mask; | 50 | static cpumask_t smp_commenced_mask; |
| 51 | static cpumask_t cpu_callout_map; | 51 | static cpumask_t cpu_callout_map; |
| 52 | 52 | ||
| @@ -155,7 +155,7 @@ void cpu_panic(void) | |||
| 155 | panic("SMP bolixed\n"); | 155 | panic("SMP bolixed\n"); |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | static unsigned long current_tick_offset; | 158 | static unsigned long current_tick_offset __read_mostly; |
| 159 | 159 | ||
| 160 | /* This tick register synchronization scheme is taken entirely from | 160 | /* This tick register synchronization scheme is taken entirely from |
| 161 | * the ia64 port, see arch/ia64/kernel/smpboot.c for details and credit. | 161 | * the ia64 port, see arch/ia64/kernel/smpboot.c for details and credit. |
| @@ -1193,8 +1193,8 @@ void smp_send_stop(void) | |||
| 1193 | { | 1193 | { |
| 1194 | } | 1194 | } |
| 1195 | 1195 | ||
| 1196 | unsigned long __per_cpu_base; | 1196 | unsigned long __per_cpu_base __read_mostly; |
| 1197 | unsigned long __per_cpu_shift; | 1197 | unsigned long __per_cpu_shift __read_mostly; |
| 1198 | 1198 | ||
| 1199 | EXPORT_SYMBOL(__per_cpu_base); | 1199 | EXPORT_SYMBOL(__per_cpu_base); |
| 1200 | EXPORT_SYMBOL(__per_cpu_shift); | 1200 | EXPORT_SYMBOL(__per_cpu_shift); |
diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c index 56cd96f4a5cd..9202d925a9ce 100644 --- a/arch/sparc64/kernel/sparc64_ksyms.c +++ b/arch/sparc64/kernel/sparc64_ksyms.c | |||
| @@ -79,7 +79,7 @@ extern void linux_sparc_syscall(void); | |||
| 79 | extern void rtrap(void); | 79 | extern void rtrap(void); |
| 80 | extern void show_regs(struct pt_regs *); | 80 | extern void show_regs(struct pt_regs *); |
| 81 | extern void solaris_syscall(void); | 81 | extern void solaris_syscall(void); |
| 82 | extern void syscall_trace(void); | 82 | extern void syscall_trace(struct pt_regs *, int); |
| 83 | extern u32 sunos_sys_table[], sys_call_table32[]; | 83 | extern u32 sunos_sys_table[], sys_call_table32[]; |
| 84 | extern void tl0_solaris(void); | 84 | extern void tl0_solaris(void); |
| 85 | extern void sys_sigsuspend(void); | 85 | extern void sys_sigsuspend(void); |
diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S index 5a95e98c5317..5f9e4fae612e 100644 --- a/arch/sparc64/kernel/sys32.S +++ b/arch/sparc64/kernel/sys32.S | |||
| @@ -135,6 +135,8 @@ SIGN2(sys32_shutdown, sys_shutdown, %o0, %o1) | |||
| 135 | SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2) | 135 | SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2) |
| 136 | SIGN1(sys32_getpeername, sys_getpeername, %o0) | 136 | SIGN1(sys32_getpeername, sys_getpeername, %o0) |
| 137 | SIGN1(sys32_getsockname, sys_getsockname, %o0) | 137 | SIGN1(sys32_getsockname, sys_getsockname, %o0) |
| 138 | SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1) | ||
| 139 | SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2) | ||
| 138 | 140 | ||
| 139 | .globl sys32_mmap2 | 141 | .globl sys32_mmap2 |
| 140 | sys32_mmap2: | 142 | sys32_mmap2: |
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index a5e36a4c8924..bceb91a8a2bd 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
| @@ -59,11 +59,11 @@ sys_call_table32: | |||
| 59 | /*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall | 59 | /*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall |
| 60 | .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sparc64_newuname | 60 | .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sparc64_newuname |
| 61 | /*190*/ .word sys32_init_module, sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl | 61 | /*190*/ .word sys32_init_module, sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl |
| 62 | .word sys32_epoll_wait, sys_nis_syscall, sys_getppid, sys32_sigaction, sys_sgetmask | 62 | .word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask |
| 63 | /*200*/ .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir | 63 | /*200*/ .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir |
| 64 | .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64 | 64 | .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64 |
| 65 | /*210*/ .word sys32_fadvise64_64, sys32_tgkill, sys32_waitpid, sys_swapoff, sys32_sysinfo | 65 | /*210*/ .word sys32_fadvise64_64, sys32_tgkill, sys32_waitpid, sys_swapoff, sys32_sysinfo |
| 66 | .word sys32_ipc, sys32_sigreturn, sys_clone, sys_nis_syscall, sys32_adjtimex | 66 | .word sys32_ipc, sys32_sigreturn, sys_clone, sys32_ioprio_get, sys32_adjtimex |
| 67 | /*220*/ .word sys32_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys32_getpgid | 67 | /*220*/ .word sys32_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys32_getpgid |
| 68 | .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys32_setfsuid16, sys32_setfsgid16 | 68 | .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys32_setfsuid16, sys32_setfsgid16 |
| 69 | /*230*/ .word sys32_select, compat_sys_time, sys_nis_syscall, compat_sys_stime, compat_sys_statfs64 | 69 | /*230*/ .word sys32_select, compat_sys_time, sys_nis_syscall, compat_sys_stime, compat_sys_statfs64 |
| @@ -125,11 +125,11 @@ sys_call_table: | |||
| 125 | /*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall | 125 | /*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall |
| 126 | .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sparc64_newuname | 126 | .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sparc64_newuname |
| 127 | /*190*/ .word sys_init_module, sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl | 127 | /*190*/ .word sys_init_module, sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl |
| 128 | .word sys_epoll_wait, sys_nis_syscall, sys_getppid, sys_nis_syscall, sys_sgetmask | 128 | .word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask |
| 129 | /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall | 129 | /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall |
| 130 | .word sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 | 130 | .word sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 |
| 131 | /*210*/ .word sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo | 131 | /*210*/ .word sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo |
| 132 | .word sys_ipc, sys_nis_syscall, sys_clone, sys_nis_syscall, sys_adjtimex | 132 | .word sys_ipc, sys_nis_syscall, sys_clone, sys_ioprio_get, sys_adjtimex |
| 133 | /*220*/ .word sys_nis_syscall, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid | 133 | /*220*/ .word sys_nis_syscall, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid |
| 134 | .word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid, sys_setfsgid | 134 | .word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid, sys_setfsgid |
| 135 | /*230*/ .word sys_select, sys_nis_syscall, sys_nis_syscall, sys_stime, sys_statfs64 | 135 | /*230*/ .word sys_select, sys_nis_syscall, sys_nis_syscall, sys_stime, sys_statfs64 |
diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c index b40db389f90b..362b9c26871b 100644 --- a/arch/sparc64/kernel/time.c +++ b/arch/sparc64/kernel/time.c | |||
| @@ -73,7 +73,7 @@ static __initdata struct sparc64_tick_ops dummy_tick_ops = { | |||
| 73 | .get_tick = dummy_get_tick, | 73 | .get_tick = dummy_get_tick, |
| 74 | }; | 74 | }; |
| 75 | 75 | ||
| 76 | struct sparc64_tick_ops *tick_ops = &dummy_tick_ops; | 76 | struct sparc64_tick_ops *tick_ops __read_mostly = &dummy_tick_ops; |
| 77 | 77 | ||
| 78 | #define TICK_PRIV_BIT (1UL << 63) | 78 | #define TICK_PRIV_BIT (1UL << 63) |
| 79 | 79 | ||
| @@ -195,7 +195,7 @@ static unsigned long tick_add_tick(unsigned long adj, unsigned long offset) | |||
| 195 | return new_tick; | 195 | return new_tick; |
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | static struct sparc64_tick_ops tick_operations = { | 198 | static struct sparc64_tick_ops tick_operations __read_mostly = { |
| 199 | .init_tick = tick_init_tick, | 199 | .init_tick = tick_init_tick, |
| 200 | .get_tick = tick_get_tick, | 200 | .get_tick = tick_get_tick, |
| 201 | .get_compare = tick_get_compare, | 201 | .get_compare = tick_get_compare, |
| @@ -276,7 +276,7 @@ static unsigned long stick_add_compare(unsigned long adj) | |||
| 276 | return new_compare; | 276 | return new_compare; |
| 277 | } | 277 | } |
| 278 | 278 | ||
| 279 | static struct sparc64_tick_ops stick_operations = { | 279 | static struct sparc64_tick_ops stick_operations __read_mostly = { |
| 280 | .init_tick = stick_init_tick, | 280 | .init_tick = stick_init_tick, |
| 281 | .get_tick = stick_get_tick, | 281 | .get_tick = stick_get_tick, |
| 282 | .get_compare = stick_get_compare, | 282 | .get_compare = stick_get_compare, |
| @@ -422,7 +422,7 @@ static unsigned long hbtick_add_compare(unsigned long adj) | |||
| 422 | return val; | 422 | return val; |
| 423 | } | 423 | } |
| 424 | 424 | ||
| 425 | static struct sparc64_tick_ops hbtick_operations = { | 425 | static struct sparc64_tick_ops hbtick_operations __read_mostly = { |
| 426 | .init_tick = hbtick_init_tick, | 426 | .init_tick = hbtick_init_tick, |
| 427 | .get_tick = hbtick_get_tick, | 427 | .get_tick = hbtick_get_tick, |
| 428 | .get_compare = hbtick_get_compare, | 428 | .get_compare = hbtick_get_compare, |
| @@ -437,10 +437,9 @@ static struct sparc64_tick_ops hbtick_operations = { | |||
| 437 | * NOTE: On SUN5 systems the ticker interrupt comes in using 2 | 437 | * NOTE: On SUN5 systems the ticker interrupt comes in using 2 |
| 438 | * interrupts, one at level14 and one with softint bit 0. | 438 | * interrupts, one at level14 and one with softint bit 0. |
| 439 | */ | 439 | */ |
| 440 | unsigned long timer_tick_offset; | 440 | unsigned long timer_tick_offset __read_mostly; |
| 441 | unsigned long timer_tick_compare; | ||
| 442 | 441 | ||
| 443 | static unsigned long timer_ticks_per_nsec_quotient; | 442 | static unsigned long timer_ticks_per_nsec_quotient __read_mostly; |
| 444 | 443 | ||
| 445 | #define TICK_SIZE (tick_nsec / 1000) | 444 | #define TICK_SIZE (tick_nsec / 1000) |
| 446 | 445 | ||
| @@ -464,7 +463,7 @@ static inline void timer_check_rtc(void) | |||
| 464 | 463 | ||
| 465 | static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) | 464 | static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) |
| 466 | { | 465 | { |
| 467 | unsigned long ticks, pstate; | 466 | unsigned long ticks, compare, pstate; |
| 468 | 467 | ||
| 469 | write_seqlock(&xtime_lock); | 468 | write_seqlock(&xtime_lock); |
| 470 | 469 | ||
| @@ -483,14 +482,14 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) | |||
| 483 | : "=r" (pstate) | 482 | : "=r" (pstate) |
| 484 | : "i" (PSTATE_IE)); | 483 | : "i" (PSTATE_IE)); |
| 485 | 484 | ||
| 486 | timer_tick_compare = tick_ops->add_compare(timer_tick_offset); | 485 | compare = tick_ops->add_compare(timer_tick_offset); |
| 487 | ticks = tick_ops->get_tick(); | 486 | ticks = tick_ops->get_tick(); |
| 488 | 487 | ||
| 489 | /* Restore PSTATE_IE. */ | 488 | /* Restore PSTATE_IE. */ |
| 490 | __asm__ __volatile__("wrpr %0, 0x0, %%pstate" | 489 | __asm__ __volatile__("wrpr %0, 0x0, %%pstate" |
| 491 | : /* no outputs */ | 490 | : /* no outputs */ |
| 492 | : "r" (pstate)); | 491 | : "r" (pstate)); |
| 493 | } while (time_after_eq(ticks, timer_tick_compare)); | 492 | } while (time_after_eq(ticks, compare)); |
| 494 | 493 | ||
| 495 | timer_check_rtc(); | 494 | timer_check_rtc(); |
| 496 | 495 | ||
| @@ -506,11 +505,6 @@ void timer_tick_interrupt(struct pt_regs *regs) | |||
| 506 | 505 | ||
| 507 | do_timer(regs); | 506 | do_timer(regs); |
| 508 | 507 | ||
| 509 | /* | ||
| 510 | * Only keep timer_tick_offset uptodate, but don't set TICK_CMPR. | ||
| 511 | */ | ||
| 512 | timer_tick_compare = tick_ops->get_compare() + timer_tick_offset; | ||
| 513 | |||
| 514 | timer_check_rtc(); | 508 | timer_check_rtc(); |
| 515 | 509 | ||
| 516 | write_sequnlock(&xtime_lock); | 510 | write_sequnlock(&xtime_lock); |
diff --git a/arch/sparc64/kernel/vmlinux.lds.S b/arch/sparc64/kernel/vmlinux.lds.S index 382fd6798bb9..950423da8a6a 100644 --- a/arch/sparc64/kernel/vmlinux.lds.S +++ b/arch/sparc64/kernel/vmlinux.lds.S | |||
| @@ -32,6 +32,8 @@ SECTIONS | |||
| 32 | .data1 : { *(.data1) } | 32 | .data1 : { *(.data1) } |
| 33 | . = ALIGN(64); | 33 | . = ALIGN(64); |
| 34 | .data.cacheline_aligned : { *(.data.cacheline_aligned) } | 34 | .data.cacheline_aligned : { *(.data.cacheline_aligned) } |
| 35 | . = ALIGN(64); | ||
| 36 | .data.read_mostly : { *(.data.read_mostly) } | ||
| 35 | _edata = .; | 37 | _edata = .; |
| 36 | PROVIDE (edata = .); | 38 | PROVIDE (edata = .); |
| 37 | .fixup : { *(.fixup) } | 39 | .fixup : { *(.fixup) } |
