diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-03 12:52:04 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-03 12:52:04 -0400 |
| commit | 3ba113d14cedcd88105a3b9c90f8ecce829e1095 (patch) | |
| tree | 357f50c6a45bf57a16d46b3157dfcd4e28233079 /arch/parisc/kernel | |
| parent | bad6a5c08c119572c888d5df2bd7691a4da6b9e8 (diff) | |
| parent | b609308e1415efebdf79ebd553f4dd47b0ff2722 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6: (23 commits)
parisc: move dereference_function_descriptor to process.c
parisc: Move kernel Elf_Fdesc define to <asm/elf.h>
parisc: fix build when ARCH_HAS_KMAP
parisc: fix "make tar-pkg"
parisc: drivers: fix warnings
parisc: select BUG always
parisc: asm/pdc.h should include asm/page.h
parisc: led: remove proc_dir_entry::owner
parisc: fix macro expansion in atomic.h
parisc: iosapic: fix build breakage
parisc: oops_enter()/oops_exit() in die()
parisc: document light weight syscall ABI
parisc: blink all or loadavg LEDs on oops
parisc: add ftrace (function and graph tracer) functionality
parisc: simplify sys_clone()
parisc: add LATENCYTOP_SUPPORT and CONFIG_STACKTRACE_SUPPORT
parisc: allow to build with 16k default kernel page size
parisc: expose 32/64-bit capabilities in cpuinfo
parisc: use constants instead of numbers in assembly
parisc: fix usage of 32bit PTE page table entries on 32bit kernels
...
Diffstat (limited to 'arch/parisc/kernel')
| -rw-r--r-- | arch/parisc/kernel/Makefile | 15 | ||||
| -rw-r--r-- | arch/parisc/kernel/entry.S | 60 | ||||
| -rw-r--r-- | arch/parisc/kernel/firmware.c | 6 | ||||
| -rw-r--r-- | arch/parisc/kernel/ftrace.c | 185 | ||||
| -rw-r--r-- | arch/parisc/kernel/irq.c | 4 | ||||
| -rw-r--r-- | arch/parisc/kernel/module.c | 18 | ||||
| -rw-r--r-- | arch/parisc/kernel/parisc_ksyms.c | 5 | ||||
| -rw-r--r-- | arch/parisc/kernel/process.c | 29 | ||||
| -rw-r--r-- | arch/parisc/kernel/processor.c | 13 | ||||
| -rw-r--r-- | arch/parisc/kernel/smp.c | 21 | ||||
| -rw-r--r-- | arch/parisc/kernel/stacktrace.c | 63 | ||||
| -rw-r--r-- | arch/parisc/kernel/syscall.S | 58 | ||||
| -rw-r--r-- | arch/parisc/kernel/time.c | 3 | ||||
| -rw-r--r-- | arch/parisc/kernel/traps.c | 5 | ||||
| -rw-r--r-- | arch/parisc/kernel/vmlinux.lds.S | 2 |
15 files changed, 416 insertions, 71 deletions
diff --git a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile index 016d3fc4111c..67db0722e6ca 100644 --- a/arch/parisc/kernel/Makefile +++ b/arch/parisc/kernel/Makefile | |||
| @@ -11,10 +11,25 @@ obj-y := cache.o pacache.o setup.o traps.o time.o irq.o \ | |||
| 11 | process.o processor.o pdc_cons.o pdc_chassis.o unwind.o \ | 11 | process.o processor.o pdc_cons.o pdc_chassis.o unwind.o \ |
| 12 | topology.o | 12 | topology.o |
| 13 | 13 | ||
| 14 | ifdef CONFIG_FUNCTION_TRACER | ||
| 15 | # Do not profile debug and lowlevel utilities | ||
| 16 | CFLAGS_REMOVE_ftrace.o = -pg | ||
| 17 | CFLAGS_REMOVE_cache.o = -pg | ||
| 18 | CFLAGS_REMOVE_irq.o = -pg | ||
| 19 | CFLAGS_REMOVE_pacache.o = -pg | ||
| 20 | CFLAGS_REMOVE_perf.o = -pg | ||
| 21 | CFLAGS_REMOVE_traps.o = -pg | ||
| 22 | CFLAGS_REMOVE_unaligned.o = -pg | ||
| 23 | CFLAGS_REMOVE_unwind.o = -pg | ||
| 24 | endif | ||
| 25 | |||
| 14 | obj-$(CONFIG_SMP) += smp.o | 26 | obj-$(CONFIG_SMP) += smp.o |
| 15 | obj-$(CONFIG_PA11) += pci-dma.o | 27 | obj-$(CONFIG_PA11) += pci-dma.o |
| 16 | obj-$(CONFIG_PCI) += pci.o | 28 | obj-$(CONFIG_PCI) += pci.o |
| 17 | obj-$(CONFIG_MODULES) += module.o | 29 | obj-$(CONFIG_MODULES) += module.o |
| 18 | obj-$(CONFIG_64BIT) += binfmt_elf32.o sys_parisc32.o signal32.o | 30 | obj-$(CONFIG_64BIT) += binfmt_elf32.o sys_parisc32.o signal32.o |
| 31 | obj-$(CONFIG_STACKTRACE)+= stacktrace.o | ||
| 19 | # only supported for PCX-W/U in 64-bit mode at the moment | 32 | # only supported for PCX-W/U in 64-bit mode at the moment |
| 20 | obj-$(CONFIG_64BIT) += perf.o perf_asm.o | 33 | obj-$(CONFIG_64BIT) += perf.o perf_asm.o |
| 34 | obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o | ||
| 35 | obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o | ||
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index 0db9fdcb7709..ae3e70cd1e14 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
| @@ -505,6 +505,18 @@ | |||
| 505 | STREG \pte,0(\ptep) | 505 | STREG \pte,0(\ptep) |
| 506 | .endm | 506 | .endm |
| 507 | 507 | ||
| 508 | /* bitshift difference between a PFN (based on kernel's PAGE_SIZE) | ||
| 509 | * to a CPU TLB 4k PFN (4k => 12 bits to shift) */ | ||
| 510 | #define PAGE_ADD_SHIFT (PAGE_SHIFT-12) | ||
| 511 | |||
| 512 | /* Drop prot bits and convert to page addr for iitlbt and idtlbt */ | ||
| 513 | .macro convert_for_tlb_insert20 pte | ||
| 514 | extrd,u \pte,(63-ASM_PFN_PTE_SHIFT)+(63-58)+PAGE_ADD_SHIFT,\ | ||
| 515 | 64-PAGE_SHIFT-PAGE_ADD_SHIFT,\pte | ||
| 516 | depdi _PAGE_SIZE_ENCODING_DEFAULT,63,\ | ||
| 517 | (63-58)+PAGE_ADD_SHIFT,\pte | ||
| 518 | .endm | ||
| 519 | |||
| 508 | /* Convert the pte and prot to tlb insertion values. How | 520 | /* Convert the pte and prot to tlb insertion values. How |
| 509 | * this happens is quite subtle, read below */ | 521 | * this happens is quite subtle, read below */ |
| 510 | .macro make_insert_tlb spc,pte,prot | 522 | .macro make_insert_tlb spc,pte,prot |
| @@ -544,8 +556,7 @@ | |||
| 544 | depi 1,12,1,\prot | 556 | depi 1,12,1,\prot |
| 545 | 557 | ||
| 546 | /* Drop prot bits and convert to page addr for iitlbt and idtlbt */ | 558 | /* Drop prot bits and convert to page addr for iitlbt and idtlbt */ |
| 547 | extrd,u \pte,(63-ASM_PFN_PTE_SHIFT)+(63-58),64-PAGE_SHIFT,\pte | 559 | convert_for_tlb_insert20 \pte |
| 548 | depdi _PAGE_SIZE_ENCODING_DEFAULT,63,63-58,\pte | ||
| 549 | .endm | 560 | .endm |
| 550 | 561 | ||
| 551 | /* Identical macro to make_insert_tlb above, except it | 562 | /* Identical macro to make_insert_tlb above, except it |
| @@ -563,8 +574,8 @@ | |||
| 563 | 574 | ||
| 564 | /* Get rid of prot bits and convert to page addr for iitlba */ | 575 | /* Get rid of prot bits and convert to page addr for iitlba */ |
| 565 | 576 | ||
| 566 | depi _PAGE_SIZE_ENCODING_DEFAULT,31,ASM_PFN_PTE_SHIFT,\pte | 577 | depi 0,31,ASM_PFN_PTE_SHIFT,\pte |
| 567 | extru \pte,24,25,\pte | 578 | SHRREG \pte,(ASM_PFN_PTE_SHIFT-(31-26)),\pte |
| 568 | .endm | 579 | .endm |
| 569 | 580 | ||
| 570 | /* This is for ILP32 PA2.0 only. The TLB insertion needs | 581 | /* This is for ILP32 PA2.0 only. The TLB insertion needs |
| @@ -1244,10 +1255,9 @@ nadtlb_check_flush_20w: | |||
| 1244 | depdi,z 7,7,3,prot | 1255 | depdi,z 7,7,3,prot |
| 1245 | depdi 1,10,1,prot | 1256 | depdi 1,10,1,prot |
| 1246 | 1257 | ||
| 1247 | /* Get rid of prot bits and convert to page addr for idtlbt */ | 1258 | /* Drop prot bits from pte and convert to page addr for idtlbt */ |
| 1259 | convert_for_tlb_insert20 pte | ||
| 1248 | 1260 | ||
| 1249 | depdi 0,63,12,pte | ||
| 1250 | extrd,u pte,56,52,pte | ||
| 1251 | idtlbt pte,prot | 1261 | idtlbt pte,prot |
| 1252 | 1262 | ||
| 1253 | rfir | 1263 | rfir |
| @@ -1337,8 +1347,8 @@ nadtlb_check_flush_11: | |||
| 1337 | 1347 | ||
| 1338 | /* Get rid of prot bits and convert to page addr for idtlba */ | 1348 | /* Get rid of prot bits and convert to page addr for idtlba */ |
| 1339 | 1349 | ||
| 1340 | depi 0,31,12,pte | 1350 | depi 0,31,ASM_PFN_PTE_SHIFT,pte |
| 1341 | extru pte,24,25,pte | 1351 | SHRREG pte,(ASM_PFN_PTE_SHIFT-(31-26)),pte |
| 1342 | 1352 | ||
| 1343 | mfsp %sr1,t0 /* Save sr1 so we can use it in tlb inserts */ | 1353 | mfsp %sr1,t0 /* Save sr1 so we can use it in tlb inserts */ |
| 1344 | mtsp spc,%sr1 | 1354 | mtsp spc,%sr1 |
| @@ -1403,10 +1413,9 @@ nadtlb_check_flush_20: | |||
| 1403 | depdi,z 7,7,3,prot | 1413 | depdi,z 7,7,3,prot |
| 1404 | depdi 1,10,1,prot | 1414 | depdi 1,10,1,prot |
| 1405 | 1415 | ||
| 1406 | /* Get rid of prot bits and convert to page addr for idtlbt */ | 1416 | /* Drop prot bits from pte and convert to page addr for idtlbt */ |
| 1417 | convert_for_tlb_insert20 pte | ||
| 1407 | 1418 | ||
| 1408 | depdi 0,63,12,pte | ||
| 1409 | extrd,u pte,56,32,pte | ||
| 1410 | idtlbt pte,prot | 1419 | idtlbt pte,prot |
| 1411 | 1420 | ||
| 1412 | rfir | 1421 | rfir |
| @@ -2176,6 +2185,33 @@ syscall_do_resched: | |||
| 2176 | ENDPROC(syscall_exit) | 2185 | ENDPROC(syscall_exit) |
| 2177 | 2186 | ||
| 2178 | 2187 | ||
| 2188 | #ifdef CONFIG_FUNCTION_TRACER | ||
| 2189 | .import ftrace_function_trampoline,code | ||
| 2190 | ENTRY(_mcount) | ||
| 2191 | copy %r3, %arg2 | ||
| 2192 | b ftrace_function_trampoline | ||
| 2193 | nop | ||
| 2194 | ENDPROC(_mcount) | ||
| 2195 | |||
| 2196 | ENTRY(return_to_handler) | ||
| 2197 | load32 return_trampoline, %rp | ||
| 2198 | copy %ret0, %arg0 | ||
| 2199 | copy %ret1, %arg1 | ||
| 2200 | b ftrace_return_to_handler | ||
| 2201 | nop | ||
| 2202 | return_trampoline: | ||
| 2203 | copy %ret0, %rp | ||
| 2204 | copy %r23, %ret0 | ||
| 2205 | copy %r24, %ret1 | ||
| 2206 | |||
| 2207 | .globl ftrace_stub | ||
| 2208 | ftrace_stub: | ||
| 2209 | bv %r0(%rp) | ||
| 2210 | nop | ||
| 2211 | ENDPROC(return_to_handler) | ||
| 2212 | #endif /* CONFIG_FUNCTION_TRACER */ | ||
| 2213 | |||
| 2214 | |||
| 2179 | get_register: | 2215 | get_register: |
| 2180 | /* | 2216 | /* |
| 2181 | * get_register is used by the non access tlb miss handlers to | 2217 | * get_register is used by the non access tlb miss handlers to |
diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index f6d241238a78..4c247e02d9b1 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c | |||
| @@ -527,7 +527,11 @@ int pdc_model_capabilities(unsigned long *capabilities) | |||
| 527 | pdc_result[0] = 0; /* preset zero (call may not be implemented!) */ | 527 | pdc_result[0] = 0; /* preset zero (call may not be implemented!) */ |
| 528 | retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES, __pa(pdc_result), 0); | 528 | retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES, __pa(pdc_result), 0); |
| 529 | convert_to_wide(pdc_result); | 529 | convert_to_wide(pdc_result); |
| 530 | *capabilities = pdc_result[0]; | 530 | if (retval == PDC_OK) { |
| 531 | *capabilities = pdc_result[0]; | ||
| 532 | } else { | ||
| 533 | *capabilities = PDC_MODEL_OS32; | ||
| 534 | } | ||
| 531 | spin_unlock_irqrestore(&pdc_lock, flags); | 535 | spin_unlock_irqrestore(&pdc_lock, flags); |
| 532 | 536 | ||
| 533 | return retval; | 537 | return retval; |
diff --git a/arch/parisc/kernel/ftrace.c b/arch/parisc/kernel/ftrace.c new file mode 100644 index 000000000000..9877372ffdba --- /dev/null +++ b/arch/parisc/kernel/ftrace.c | |||
| @@ -0,0 +1,185 @@ | |||
| 1 | /* | ||
| 2 | * Code for tracing calls in Linux kernel. | ||
| 3 | * Copyright (C) 2009 Helge Deller <deller@gmx.de> | ||
| 4 | * | ||
| 5 | * based on code for x86 which is: | ||
| 6 | * Copyright (C) 2007-2008 Steven Rostedt <srostedt@redhat.com> | ||
| 7 | * | ||
| 8 | * future possible enhancements: | ||
| 9 | * - add CONFIG_DYNAMIC_FTRACE | ||
| 10 | * - add CONFIG_STACK_TRACER | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include <linux/init.h> | ||
| 14 | #include <linux/ftrace.h> | ||
| 15 | |||
| 16 | #include <asm/sections.h> | ||
| 17 | #include <asm/ftrace.h> | ||
| 18 | |||
| 19 | |||
| 20 | |||
| 21 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
| 22 | |||
| 23 | /* Add a function return address to the trace stack on thread info.*/ | ||
| 24 | static int push_return_trace(unsigned long ret, unsigned long long time, | ||
| 25 | unsigned long func, int *depth) | ||
| 26 | { | ||
| 27 | int index; | ||
| 28 | |||
| 29 | if (!current->ret_stack) | ||
| 30 | return -EBUSY; | ||
| 31 | |||
| 32 | /* The return trace stack is full */ | ||
| 33 | if (current->curr_ret_stack == FTRACE_RETFUNC_DEPTH - 1) { | ||
| 34 | atomic_inc(¤t->trace_overrun); | ||
| 35 | return -EBUSY; | ||
| 36 | } | ||
| 37 | |||
| 38 | index = ++current->curr_ret_stack; | ||
| 39 | barrier(); | ||
| 40 | current->ret_stack[index].ret = ret; | ||
| 41 | current->ret_stack[index].func = func; | ||
| 42 | current->ret_stack[index].calltime = time; | ||
| 43 | *depth = index; | ||
| 44 | |||
| 45 | return 0; | ||
| 46 | } | ||
| 47 | |||
| 48 | /* Retrieve a function return address to the trace stack on thread info.*/ | ||
| 49 | static void pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret) | ||
| 50 | { | ||
| 51 | int index; | ||
| 52 | |||
| 53 | index = current->curr_ret_stack; | ||
| 54 | |||
| 55 | if (unlikely(index < 0)) { | ||
| 56 | ftrace_graph_stop(); | ||
| 57 | WARN_ON(1); | ||
| 58 | /* Might as well panic, otherwise we have no where to go */ | ||
| 59 | *ret = (unsigned long) | ||
| 60 | dereference_function_descriptor(&panic); | ||
| 61 | return; | ||
| 62 | } | ||
| 63 | |||
| 64 | *ret = current->ret_stack[index].ret; | ||
| 65 | trace->func = current->ret_stack[index].func; | ||
| 66 | trace->calltime = current->ret_stack[index].calltime; | ||
| 67 | trace->overrun = atomic_read(¤t->trace_overrun); | ||
| 68 | trace->depth = index; | ||
| 69 | barrier(); | ||
| 70 | current->curr_ret_stack--; | ||
| 71 | |||
| 72 | } | ||
| 73 | |||
| 74 | /* | ||
| 75 | * Send the trace to the ring-buffer. | ||
| 76 | * @return the original return address. | ||
| 77 | */ | ||
| 78 | unsigned long ftrace_return_to_handler(unsigned long retval0, | ||
| 79 | unsigned long retval1) | ||
| 80 | { | ||
| 81 | struct ftrace_graph_ret trace; | ||
| 82 | unsigned long ret; | ||
| 83 | |||
| 84 | pop_return_trace(&trace, &ret); | ||
| 85 | trace.rettime = cpu_clock(raw_smp_processor_id()); | ||
| 86 | ftrace_graph_return(&trace); | ||
| 87 | |||
| 88 | if (unlikely(!ret)) { | ||
| 89 | ftrace_graph_stop(); | ||
| 90 | WARN_ON(1); | ||
| 91 | /* Might as well panic. What else to do? */ | ||
| 92 | ret = (unsigned long) | ||
| 93 | dereference_function_descriptor(&panic); | ||
| 94 | } | ||
| 95 | |||
| 96 | /* HACK: we hand over the old functions' return values | ||
| 97 | in %r23 and %r24. Assembly in entry.S will take care | ||
| 98 | and move those to their final registers %ret0 and %ret1 */ | ||
| 99 | asm( "copy %0, %%r23 \n\t" | ||
| 100 | "copy %1, %%r24 \n" : : "r" (retval0), "r" (retval1) ); | ||
| 101 | |||
| 102 | return ret; | ||
| 103 | } | ||
| 104 | |||
| 105 | /* | ||
| 106 | * Hook the return address and push it in the stack of return addrs | ||
| 107 | * in current thread info. | ||
| 108 | */ | ||
| 109 | void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) | ||
| 110 | { | ||
| 111 | unsigned long old; | ||
| 112 | unsigned long long calltime; | ||
| 113 | struct ftrace_graph_ent trace; | ||
| 114 | |||
| 115 | if (unlikely(atomic_read(¤t->tracing_graph_pause))) | ||
| 116 | return; | ||
| 117 | |||
| 118 | old = *parent; | ||
| 119 | *parent = (unsigned long) | ||
| 120 | dereference_function_descriptor(&return_to_handler); | ||
| 121 | |||
| 122 | if (unlikely(!__kernel_text_address(old))) { | ||
| 123 | ftrace_graph_stop(); | ||
| 124 | *parent = old; | ||
| 125 | WARN_ON(1); | ||
| 126 | return; | ||
| 127 | } | ||
| 128 | |||
| 129 | calltime = cpu_clock(raw_smp_processor_id()); | ||
| 130 | |||
| 131 | if (push_return_trace(old, calltime, | ||
| 132 | self_addr, &trace.depth) == -EBUSY) { | ||
| 133 | *parent = old; | ||
| 134 | return; | ||
| 135 | } | ||
| 136 | |||
| 137 | trace.func = self_addr; | ||
| 138 | |||
| 139 | /* Only trace if the calling function expects to */ | ||
| 140 | if (!ftrace_graph_entry(&trace)) { | ||
| 141 | current->curr_ret_stack--; | ||
| 142 | *parent = old; | ||
| 143 | } | ||
| 144 | } | ||
| 145 | |||
| 146 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | ||
| 147 | |||
| 148 | |||
| 149 | void ftrace_function_trampoline(unsigned long parent, | ||
| 150 | unsigned long self_addr, | ||
| 151 | unsigned long org_sp_gr3) | ||
| 152 | { | ||
| 153 | extern ftrace_func_t ftrace_trace_function; | ||
| 154 | |||
| 155 | if (function_trace_stop) | ||
| 156 | return; | ||
| 157 | |||
| 158 | if (ftrace_trace_function != ftrace_stub) { | ||
| 159 | ftrace_trace_function(parent, self_addr); | ||
| 160 | return; | ||
| 161 | } | ||
| 162 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
| 163 | if (ftrace_graph_entry && ftrace_graph_return) { | ||
| 164 | unsigned long sp; | ||
| 165 | unsigned long *parent_rp; | ||
| 166 | |||
| 167 | asm volatile ("copy %%r30, %0" : "=r"(sp)); | ||
| 168 | /* sanity check: is stack pointer which we got from | ||
| 169 | assembler function in entry.S in a reasonable | ||
| 170 | range compared to current stack pointer? */ | ||
| 171 | if ((sp - org_sp_gr3) > 0x400) | ||
| 172 | return; | ||
| 173 | |||
| 174 | /* calculate pointer to %rp in stack */ | ||
| 175 | parent_rp = (unsigned long *) org_sp_gr3 - 0x10; | ||
| 176 | /* sanity check: parent_rp should hold parent */ | ||
| 177 | if (*parent_rp != parent) | ||
| 178 | return; | ||
| 179 | |||
| 180 | prepare_ftrace_return(parent_rp, self_addr); | ||
| 181 | return; | ||
| 182 | } | ||
| 183 | #endif | ||
| 184 | } | ||
| 185 | |||
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 1c740f5cbd63..4ea4229d765c 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
| @@ -311,12 +311,12 @@ unsigned long txn_alloc_addr(unsigned int virt_irq) | |||
| 311 | next_cpu++; /* assign to "next" CPU we want this bugger on */ | 311 | next_cpu++; /* assign to "next" CPU we want this bugger on */ |
| 312 | 312 | ||
| 313 | /* validate entry */ | 313 | /* validate entry */ |
| 314 | while ((next_cpu < NR_CPUS) && | 314 | while ((next_cpu < nr_cpu_ids) && |
| 315 | (!per_cpu(cpu_data, next_cpu).txn_addr || | 315 | (!per_cpu(cpu_data, next_cpu).txn_addr || |
| 316 | !cpu_online(next_cpu))) | 316 | !cpu_online(next_cpu))) |
| 317 | next_cpu++; | 317 | next_cpu++; |
| 318 | 318 | ||
| 319 | if (next_cpu >= NR_CPUS) | 319 | if (next_cpu >= nr_cpu_ids) |
| 320 | next_cpu = 0; /* nothing else, assign monarch */ | 320 | next_cpu = 0; /* nothing else, assign monarch */ |
| 321 | 321 | ||
| 322 | return txn_affinity_addr(virt_irq, next_cpu); | 322 | return txn_affinity_addr(virt_irq, next_cpu); |
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index 9013243cecca..ecd1c5024447 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
| @@ -61,9 +61,7 @@ | |||
| 61 | #include <linux/string.h> | 61 | #include <linux/string.h> |
| 62 | #include <linux/kernel.h> | 62 | #include <linux/kernel.h> |
| 63 | #include <linux/bug.h> | 63 | #include <linux/bug.h> |
| 64 | #include <linux/uaccess.h> | ||
| 65 | 64 | ||
| 66 | #include <asm/sections.h> | ||
| 67 | #include <asm/unwind.h> | 65 | #include <asm/unwind.h> |
| 68 | 66 | ||
| 69 | #if 0 | 67 | #if 0 |
| @@ -115,8 +113,6 @@ struct got_entry { | |||
| 115 | Elf32_Addr addr; | 113 | Elf32_Addr addr; |
| 116 | }; | 114 | }; |
| 117 | 115 | ||
| 118 | #define Elf_Fdesc Elf32_Fdesc | ||
| 119 | |||
| 120 | struct stub_entry { | 116 | struct stub_entry { |
| 121 | Elf32_Word insns[2]; /* each stub entry has two insns */ | 117 | Elf32_Word insns[2]; /* each stub entry has two insns */ |
| 122 | }; | 118 | }; |
| @@ -125,8 +121,6 @@ struct got_entry { | |||
| 125 | Elf64_Addr addr; | 121 | Elf64_Addr addr; |
| 126 | }; | 122 | }; |
| 127 | 123 | ||
| 128 | #define Elf_Fdesc Elf64_Fdesc | ||
| 129 | |||
| 130 | struct stub_entry { | 124 | struct stub_entry { |
| 131 | Elf64_Word insns[4]; /* each stub entry has four insns */ | 125 | Elf64_Word insns[4]; /* each stub entry has four insns */ |
| 132 | }; | 126 | }; |
| @@ -916,15 +910,3 @@ void module_arch_cleanup(struct module *mod) | |||
| 916 | deregister_unwind_table(mod); | 910 | deregister_unwind_table(mod); |
| 917 | module_bug_cleanup(mod); | 911 | module_bug_cleanup(mod); |
| 918 | } | 912 | } |
| 919 | |||
| 920 | #ifdef CONFIG_64BIT | ||
| 921 | void *dereference_function_descriptor(void *ptr) | ||
| 922 | { | ||
| 923 | Elf64_Fdesc *desc = ptr; | ||
| 924 | void *p; | ||
| 925 | |||
| 926 | if (!probe_kernel_address(&desc->addr, p)) | ||
| 927 | ptr = p; | ||
| 928 | return ptr; | ||
| 929 | } | ||
| 930 | #endif | ||
diff --git a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c index 0eecfbbc59cd..df653663d3db 100644 --- a/arch/parisc/kernel/parisc_ksyms.c +++ b/arch/parisc/kernel/parisc_ksyms.c | |||
| @@ -153,5 +153,10 @@ EXPORT_SYMBOL(node_data); | |||
| 153 | EXPORT_SYMBOL(pfnnid_map); | 153 | EXPORT_SYMBOL(pfnnid_map); |
| 154 | #endif | 154 | #endif |
| 155 | 155 | ||
| 156 | #ifdef CONFIG_FUNCTION_TRACER | ||
| 157 | extern void _mcount(void); | ||
| 158 | EXPORT_SYMBOL(_mcount); | ||
| 159 | #endif | ||
| 160 | |||
| 156 | /* from pacache.S -- needed for copy_page */ | 161 | /* from pacache.S -- needed for copy_page */ |
| 157 | EXPORT_SYMBOL(copy_user_page_asm); | 162 | EXPORT_SYMBOL(copy_user_page_asm); |
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c index 8aa591ed9127..6f69101f90bb 100644 --- a/arch/parisc/kernel/process.c +++ b/arch/parisc/kernel/process.c | |||
| @@ -46,14 +46,15 @@ | |||
| 46 | #include <linux/stddef.h> | 46 | #include <linux/stddef.h> |
| 47 | #include <linux/unistd.h> | 47 | #include <linux/unistd.h> |
| 48 | #include <linux/kallsyms.h> | 48 | #include <linux/kallsyms.h> |
| 49 | #include <linux/uaccess.h> | ||
| 49 | 50 | ||
| 50 | #include <asm/io.h> | 51 | #include <asm/io.h> |
| 51 | #include <asm/asm-offsets.h> | 52 | #include <asm/asm-offsets.h> |
| 52 | #include <asm/pdc.h> | 53 | #include <asm/pdc.h> |
| 53 | #include <asm/pdc_chassis.h> | 54 | #include <asm/pdc_chassis.h> |
| 54 | #include <asm/pgalloc.h> | 55 | #include <asm/pgalloc.h> |
| 55 | #include <asm/uaccess.h> | ||
| 56 | #include <asm/unwind.h> | 56 | #include <asm/unwind.h> |
| 57 | #include <asm/sections.h> | ||
| 57 | 58 | ||
| 58 | /* | 59 | /* |
| 59 | * The idle thread. There's no useful work to be | 60 | * The idle thread. There's no useful work to be |
| @@ -231,8 +232,8 @@ sys_clone(unsigned long clone_flags, unsigned long usp, | |||
| 231 | 232 | ||
| 232 | However, these last 3 args are only examined | 233 | However, these last 3 args are only examined |
| 233 | if the proper flags are set. */ | 234 | if the proper flags are set. */ |
| 234 | int __user *child_tidptr; | 235 | int __user *parent_tidptr = (int __user *)regs->gr[24]; |
| 235 | int __user *parent_tidptr; | 236 | int __user *child_tidptr = (int __user *)regs->gr[22]; |
| 236 | 237 | ||
| 237 | /* usp must be word aligned. This also prevents users from | 238 | /* usp must be word aligned. This also prevents users from |
| 238 | * passing in the value 1 (which is the signal for a special | 239 | * passing in the value 1 (which is the signal for a special |
| @@ -243,16 +244,6 @@ sys_clone(unsigned long clone_flags, unsigned long usp, | |||
| 243 | if (usp == 0) | 244 | if (usp == 0) |
| 244 | usp = regs->gr[30]; | 245 | usp = regs->gr[30]; |
| 245 | 246 | ||
| 246 | if (clone_flags & CLONE_PARENT_SETTID) | ||
| 247 | parent_tidptr = (int __user *)regs->gr[24]; | ||
| 248 | else | ||
| 249 | parent_tidptr = NULL; | ||
| 250 | |||
| 251 | if (clone_flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)) | ||
| 252 | child_tidptr = (int __user *)regs->gr[22]; | ||
| 253 | else | ||
| 254 | child_tidptr = NULL; | ||
| 255 | |||
| 256 | return do_fork(clone_flags, usp, regs, 0, parent_tidptr, child_tidptr); | 247 | return do_fork(clone_flags, usp, regs, 0, parent_tidptr, child_tidptr); |
| 257 | } | 248 | } |
| 258 | 249 | ||
| @@ -400,3 +391,15 @@ get_wchan(struct task_struct *p) | |||
| 400 | } while (count++ < 16); | 391 | } while (count++ < 16); |
| 401 | return 0; | 392 | return 0; |
| 402 | } | 393 | } |
| 394 | |||
| 395 | #ifdef CONFIG_64BIT | ||
| 396 | void *dereference_function_descriptor(void *ptr) | ||
| 397 | { | ||
| 398 | Elf64_Fdesc *desc = ptr; | ||
| 399 | void *p; | ||
| 400 | |||
| 401 | if (!probe_kernel_address(&desc->addr, p)) | ||
| 402 | ptr = p; | ||
| 403 | return ptr; | ||
| 404 | } | ||
| 405 | #endif | ||
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index ecb609342feb..e09d0f7fb6b0 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c | |||
| @@ -100,8 +100,8 @@ static int __cpuinit processor_probe(struct parisc_device *dev) | |||
| 100 | struct cpuinfo_parisc *p; | 100 | struct cpuinfo_parisc *p; |
| 101 | 101 | ||
| 102 | #ifdef CONFIG_SMP | 102 | #ifdef CONFIG_SMP |
| 103 | if (num_online_cpus() >= NR_CPUS) { | 103 | if (num_online_cpus() >= nr_cpu_ids) { |
| 104 | printk(KERN_INFO "num_online_cpus() >= NR_CPUS\n"); | 104 | printk(KERN_INFO "num_online_cpus() >= nr_cpu_ids\n"); |
| 105 | return 1; | 105 | return 1; |
| 106 | } | 106 | } |
| 107 | #else | 107 | #else |
| @@ -214,7 +214,7 @@ static int __cpuinit processor_probe(struct parisc_device *dev) | |||
| 214 | */ | 214 | */ |
| 215 | #ifdef CONFIG_SMP | 215 | #ifdef CONFIG_SMP |
| 216 | if (cpuid) { | 216 | if (cpuid) { |
| 217 | cpu_set(cpuid, cpu_present_map); | 217 | set_cpu_present(cpuid, true); |
| 218 | cpu_up(cpuid); | 218 | cpu_up(cpuid); |
| 219 | } | 219 | } |
| 220 | #endif | 220 | #endif |
| @@ -364,6 +364,13 @@ show_cpuinfo (struct seq_file *m, void *v) | |||
| 364 | boot_cpu_data.cpu_hz / 1000000, | 364 | boot_cpu_data.cpu_hz / 1000000, |
| 365 | boot_cpu_data.cpu_hz % 1000000 ); | 365 | boot_cpu_data.cpu_hz % 1000000 ); |
| 366 | 366 | ||
| 367 | seq_printf(m, "capabilities\t:"); | ||
| 368 | if (boot_cpu_data.pdc.capabilities & PDC_MODEL_OS32) | ||
| 369 | seq_printf(m, " os32"); | ||
| 370 | if (boot_cpu_data.pdc.capabilities & PDC_MODEL_OS64) | ||
| 371 | seq_printf(m, " os64"); | ||
| 372 | seq_printf(m, "\n"); | ||
| 373 | |||
| 367 | seq_printf(m, "model\t\t: %s\n" | 374 | seq_printf(m, "model\t\t: %s\n" |
| 368 | "model name\t: %s\n", | 375 | "model name\t: %s\n", |
| 369 | boot_cpu_data.pdc.sys_model_name, | 376 | boot_cpu_data.pdc.sys_model_name, |
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 9995d7ed5819..1fd0f0cec037 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/err.h> | 31 | #include <linux/err.h> |
| 32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
| 33 | #include <linux/bitops.h> | 33 | #include <linux/bitops.h> |
| 34 | #include <linux/ftrace.h> | ||
| 34 | 35 | ||
| 35 | #include <asm/system.h> | 36 | #include <asm/system.h> |
| 36 | #include <asm/atomic.h> | 37 | #include <asm/atomic.h> |
| @@ -113,14 +114,14 @@ halt_processor(void) | |||
| 113 | { | 114 | { |
| 114 | /* REVISIT : redirect I/O Interrupts to another CPU? */ | 115 | /* REVISIT : redirect I/O Interrupts to another CPU? */ |
| 115 | /* REVISIT : does PM *know* this CPU isn't available? */ | 116 | /* REVISIT : does PM *know* this CPU isn't available? */ |
| 116 | cpu_clear(smp_processor_id(), cpu_online_map); | 117 | set_cpu_online(smp_processor_id(), false); |
| 117 | local_irq_disable(); | 118 | local_irq_disable(); |
| 118 | for (;;) | 119 | for (;;) |
| 119 | ; | 120 | ; |
| 120 | } | 121 | } |
| 121 | 122 | ||
| 122 | 123 | ||
| 123 | irqreturn_t | 124 | irqreturn_t __irq_entry |
| 124 | ipi_interrupt(int irq, void *dev_id) | 125 | ipi_interrupt(int irq, void *dev_id) |
| 125 | { | 126 | { |
| 126 | int this_cpu = smp_processor_id(); | 127 | int this_cpu = smp_processor_id(); |
| @@ -214,11 +215,11 @@ ipi_send(int cpu, enum ipi_message_type op) | |||
| 214 | } | 215 | } |
| 215 | 216 | ||
| 216 | static void | 217 | static void |
| 217 | send_IPI_mask(cpumask_t mask, enum ipi_message_type op) | 218 | send_IPI_mask(const struct cpumask *mask, enum ipi_message_type op) |
| 218 | { | 219 | { |
| 219 | int cpu; | 220 | int cpu; |
| 220 | 221 | ||
| 221 | for_each_cpu_mask(cpu, mask) | 222 | for_each_cpu(cpu, mask) |
| 222 | ipi_send(cpu, op); | 223 | ipi_send(cpu, op); |
| 223 | } | 224 | } |
| 224 | 225 | ||
| @@ -257,7 +258,7 @@ smp_send_all_nop(void) | |||
| 257 | send_IPI_allbutself(IPI_NOP); | 258 | send_IPI_allbutself(IPI_NOP); |
| 258 | } | 259 | } |
| 259 | 260 | ||
| 260 | void arch_send_call_function_ipi(cpumask_t mask) | 261 | void arch_send_call_function_ipi_mask(const struct cpumask *mask) |
| 261 | { | 262 | { |
| 262 | send_IPI_mask(mask, IPI_CALL_FUNC); | 263 | send_IPI_mask(mask, IPI_CALL_FUNC); |
| 263 | } | 264 | } |
| @@ -296,13 +297,14 @@ smp_cpu_init(int cpunum) | |||
| 296 | mb(); | 297 | mb(); |
| 297 | 298 | ||
| 298 | /* Well, support 2.4 linux scheme as well. */ | 299 | /* Well, support 2.4 linux scheme as well. */ |
| 299 | if (cpu_test_and_set(cpunum, cpu_online_map)) | 300 | if (cpu_isset(cpunum, cpu_online_map)) |
| 300 | { | 301 | { |
| 301 | extern void machine_halt(void); /* arch/parisc.../process.c */ | 302 | extern void machine_halt(void); /* arch/parisc.../process.c */ |
| 302 | 303 | ||
| 303 | printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum); | 304 | printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum); |
| 304 | machine_halt(); | 305 | machine_halt(); |
| 305 | } | 306 | } |
| 307 | set_cpu_online(cpunum, true); | ||
| 306 | 308 | ||
| 307 | /* Initialise the idle task for this CPU */ | 309 | /* Initialise the idle task for this CPU */ |
| 308 | atomic_inc(&init_mm.mm_count); | 310 | atomic_inc(&init_mm.mm_count); |
| @@ -424,8 +426,8 @@ void __init smp_prepare_boot_cpu(void) | |||
| 424 | /* Setup BSP mappings */ | 426 | /* Setup BSP mappings */ |
| 425 | printk(KERN_INFO "SMP: bootstrap CPU ID is %d\n", bootstrap_processor); | 427 | printk(KERN_INFO "SMP: bootstrap CPU ID is %d\n", bootstrap_processor); |
| 426 | 428 | ||
| 427 | cpu_set(bootstrap_processor, cpu_online_map); | 429 | set_cpu_online(bootstrap_processor, true); |
| 428 | cpu_set(bootstrap_processor, cpu_present_map); | 430 | set_cpu_present(bootstrap_processor, true); |
| 429 | } | 431 | } |
| 430 | 432 | ||
| 431 | 433 | ||
| @@ -436,8 +438,7 @@ void __init smp_prepare_boot_cpu(void) | |||
| 436 | */ | 438 | */ |
| 437 | void __init smp_prepare_cpus(unsigned int max_cpus) | 439 | void __init smp_prepare_cpus(unsigned int max_cpus) |
| 438 | { | 440 | { |
| 439 | cpus_clear(cpu_present_map); | 441 | init_cpu_present(cpumask_of(0)); |
| 440 | cpu_set(0, cpu_present_map); | ||
| 441 | 442 | ||
| 442 | parisc_max_cpus = max_cpus; | 443 | parisc_max_cpus = max_cpus; |
| 443 | if (!max_cpus) | 444 | if (!max_cpus) |
diff --git a/arch/parisc/kernel/stacktrace.c b/arch/parisc/kernel/stacktrace.c new file mode 100644 index 000000000000..2fe914c5f533 --- /dev/null +++ b/arch/parisc/kernel/stacktrace.c | |||
| @@ -0,0 +1,63 @@ | |||
| 1 | /* | ||
| 2 | * Stack trace management functions | ||
| 3 | * | ||
| 4 | * Copyright (C) 2009 Helge Deller <deller@gmx.de> | ||
| 5 | * based on arch/x86/kernel/stacktrace.c by Ingo Molnar <mingo@redhat.com> | ||
| 6 | * and parisc unwind functions by Randolph Chung <tausq@debian.org> | ||
| 7 | * | ||
| 8 | * TODO: Userspace stacktrace (CONFIG_USER_STACKTRACE_SUPPORT) | ||
| 9 | */ | ||
| 10 | #include <linux/module.h> | ||
| 11 | #include <linux/stacktrace.h> | ||
| 12 | |||
| 13 | #include <asm/unwind.h> | ||
| 14 | |||
| 15 | static void dump_trace(struct task_struct *task, struct stack_trace *trace) | ||
| 16 | { | ||
| 17 | struct unwind_frame_info info; | ||
| 18 | |||
| 19 | /* initialize unwind info */ | ||
| 20 | if (task == current) { | ||
| 21 | unsigned long sp; | ||
| 22 | struct pt_regs r; | ||
| 23 | HERE: | ||
| 24 | asm volatile ("copy %%r30, %0" : "=r"(sp)); | ||
| 25 | memset(&r, 0, sizeof(struct pt_regs)); | ||
| 26 | r.iaoq[0] = (unsigned long)&&HERE; | ||
| 27 | r.gr[2] = (unsigned long)__builtin_return_address(0); | ||
| 28 | r.gr[30] = sp; | ||
| 29 | unwind_frame_init(&info, task, &r); | ||
| 30 | } else { | ||
| 31 | unwind_frame_init_from_blocked_task(&info, task); | ||
| 32 | } | ||
| 33 | |||
| 34 | /* unwind stack and save entries in stack_trace struct */ | ||
| 35 | trace->nr_entries = 0; | ||
| 36 | while (trace->nr_entries < trace->max_entries) { | ||
| 37 | if (unwind_once(&info) < 0 || info.ip == 0) | ||
| 38 | break; | ||
| 39 | |||
| 40 | if (__kernel_text_address(info.ip)) | ||
| 41 | trace->entries[trace->nr_entries++] = info.ip; | ||
| 42 | } | ||
| 43 | } | ||
| 44 | |||
| 45 | |||
| 46 | /* | ||
| 47 | * Save stack-backtrace addresses into a stack_trace buffer. | ||
| 48 | */ | ||
| 49 | void save_stack_trace(struct stack_trace *trace) | ||
| 50 | { | ||
| 51 | dump_trace(current, trace); | ||
| 52 | if (trace->nr_entries < trace->max_entries) | ||
| 53 | trace->entries[trace->nr_entries++] = ULONG_MAX; | ||
| 54 | } | ||
| 55 | EXPORT_SYMBOL_GPL(save_stack_trace); | ||
| 56 | |||
| 57 | void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) | ||
| 58 | { | ||
| 59 | dump_trace(tsk, trace); | ||
| 60 | if (trace->nr_entries < trace->max_entries) | ||
| 61 | trace->entries[trace->nr_entries++] = ULONG_MAX; | ||
| 62 | } | ||
| 63 | EXPORT_SYMBOL_GPL(save_stack_trace_tsk); | ||
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index 69b6eebc466e..59fc1a43ec3e 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S | |||
| @@ -365,17 +365,51 @@ tracesys_sigexit: | |||
| 365 | 365 | ||
| 366 | 366 | ||
| 367 | /********************************************************* | 367 | /********************************************************* |
| 368 | Light-weight-syscall code | 368 | 32/64-bit Light-Weight-Syscall ABI |
| 369 | 369 | ||
| 370 | r20 - lws number | 370 | * - Indicates a hint for userspace inline asm |
| 371 | r26,r25,r24,r23,r22 - Input registers | 371 | implementations. |
| 372 | r28 - Function return register | ||
| 373 | r21 - Error code. | ||
| 374 | 372 | ||
| 375 | Scracth: Any of the above that aren't being | 373 | Syscall number (caller-saves) |
| 376 | currently used, including r1. | 374 | - %r20 |
| 375 | * In asm clobber. | ||
| 377 | 376 | ||
| 378 | Return pointer: r31 (Not usable) | 377 | Argument registers (caller-saves) |
| 378 | - %r26, %r25, %r24, %r23, %r22 | ||
| 379 | * In asm input. | ||
| 380 | |||
| 381 | Return registers (caller-saves) | ||
| 382 | - %r28 (return), %r21 (errno) | ||
| 383 | * In asm output. | ||
| 384 | |||
| 385 | Caller-saves registers | ||
| 386 | - %r1, %r27, %r29 | ||
| 387 | - %r2 (return pointer) | ||
| 388 | - %r31 (ble link register) | ||
| 389 | * In asm clobber. | ||
| 390 | |||
| 391 | Callee-saves registers | ||
| 392 | - %r3-%r18 | ||
| 393 | - %r30 (stack pointer) | ||
| 394 | * Not in asm clobber. | ||
| 395 | |||
| 396 | If userspace is 32-bit: | ||
| 397 | Callee-saves registers | ||
| 398 | - %r19 (32-bit PIC register) | ||
| 399 | |||
| 400 | Differences from 32-bit calling convention: | ||
| 401 | - Syscall number in %r20 | ||
| 402 | - Additional argument register %r22 (arg4) | ||
| 403 | - Callee-saves %r19. | ||
| 404 | |||
| 405 | If userspace is 64-bit: | ||
| 406 | Callee-saves registers | ||
| 407 | - %r27 (64-bit PIC register) | ||
| 408 | |||
| 409 | Differences from 64-bit calling convention: | ||
| 410 | - Syscall number in %r20 | ||
| 411 | - Additional argument register %r22 (arg4) | ||
| 412 | - Callee-saves %r27. | ||
| 379 | 413 | ||
| 380 | Error codes returned by entry path: | 414 | Error codes returned by entry path: |
| 381 | 415 | ||
| @@ -473,7 +507,8 @@ lws_compare_and_swap64: | |||
| 473 | b,n lws_compare_and_swap | 507 | b,n lws_compare_and_swap |
| 474 | #else | 508 | #else |
| 475 | /* If we are not a 64-bit kernel, then we don't | 509 | /* If we are not a 64-bit kernel, then we don't |
| 476 | * implement having 64-bit input registers | 510 | * have 64-bit input registers, and calling |
| 511 | * the 64-bit LWS CAS returns ENOSYS. | ||
| 477 | */ | 512 | */ |
| 478 | b,n lws_exit_nosys | 513 | b,n lws_exit_nosys |
| 479 | #endif | 514 | #endif |
| @@ -635,12 +670,15 @@ END(sys_call_table64) | |||
| 635 | /* | 670 | /* |
| 636 | All light-weight-syscall atomic operations | 671 | All light-weight-syscall atomic operations |
| 637 | will use this set of locks | 672 | will use this set of locks |
| 673 | |||
| 674 | NOTE: The lws_lock_start symbol must be | ||
| 675 | at least 16-byte aligned for safe use | ||
| 676 | with ldcw. | ||
| 638 | */ | 677 | */ |
| 639 | .section .data | 678 | .section .data |
| 640 | .align PAGE_SIZE | 679 | .align PAGE_SIZE |
| 641 | ENTRY(lws_lock_start) | 680 | ENTRY(lws_lock_start) |
| 642 | /* lws locks */ | 681 | /* lws locks */ |
| 643 | .align 16 | ||
| 644 | .rept 16 | 682 | .rept 16 |
| 645 | /* Keep locks aligned at 16-bytes */ | 683 | /* Keep locks aligned at 16-bytes */ |
| 646 | .word 1 | 684 | .word 1 |
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index 86a99d02234f..d4dd05674c62 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/profile.h> | 24 | #include <linux/profile.h> |
| 25 | #include <linux/clocksource.h> | 25 | #include <linux/clocksource.h> |
| 26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
| 27 | #include <linux/ftrace.h> | ||
| 27 | 28 | ||
| 28 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
| 29 | #include <asm/io.h> | 30 | #include <asm/io.h> |
| @@ -53,7 +54,7 @@ static unsigned long clocktick __read_mostly; /* timer cycles per tick */ | |||
| 53 | * held off for an arbitrarily long period of time by interrupts being | 54 | * held off for an arbitrarily long period of time by interrupts being |
| 54 | * disabled, so we may miss one or more ticks. | 55 | * disabled, so we may miss one or more ticks. |
| 55 | */ | 56 | */ |
| 56 | irqreturn_t timer_interrupt(int irq, void *dev_id) | 57 | irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id) |
| 57 | { | 58 | { |
| 58 | unsigned long now; | 59 | unsigned long now; |
| 59 | unsigned long next_tick; | 60 | unsigned long next_tick; |
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index ba658d2086f7..c32f5d6d778e 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
| @@ -247,6 +247,8 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err) | |||
| 247 | 247 | ||
| 248 | oops_in_progress = 1; | 248 | oops_in_progress = 1; |
| 249 | 249 | ||
| 250 | oops_enter(); | ||
| 251 | |||
| 250 | /* Amuse the user in a SPARC fashion */ | 252 | /* Amuse the user in a SPARC fashion */ |
| 251 | if (err) printk( | 253 | if (err) printk( |
| 252 | KERN_CRIT " _______________________________ \n" | 254 | KERN_CRIT " _______________________________ \n" |
| @@ -293,6 +295,7 @@ KERN_CRIT " || ||\n"); | |||
| 293 | panic("Fatal exception"); | 295 | panic("Fatal exception"); |
| 294 | } | 296 | } |
| 295 | 297 | ||
| 298 | oops_exit(); | ||
| 296 | do_exit(SIGSEGV); | 299 | do_exit(SIGSEGV); |
| 297 | } | 300 | } |
| 298 | 301 | ||
| @@ -494,7 +497,7 @@ void parisc_terminate(char *msg, struct pt_regs *regs, int code, unsigned long o | |||
| 494 | panic(msg); | 497 | panic(msg); |
| 495 | } | 498 | } |
| 496 | 499 | ||
| 497 | void handle_interruption(int code, struct pt_regs *regs) | 500 | void notrace handle_interruption(int code, struct pt_regs *regs) |
| 498 | { | 501 | { |
| 499 | unsigned long fault_address = 0; | 502 | unsigned long fault_address = 0; |
| 500 | unsigned long fault_space = 0; | 503 | unsigned long fault_space = 0; |
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 1a3b6ccd3620..fd2cc4fd2b65 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
| @@ -54,6 +54,8 @@ SECTIONS | |||
| 54 | TEXT_TEXT | 54 | TEXT_TEXT |
| 55 | SCHED_TEXT | 55 | SCHED_TEXT |
| 56 | LOCK_TEXT | 56 | LOCK_TEXT |
| 57 | KPROBES_TEXT | ||
| 58 | IRQENTRY_TEXT | ||
| 57 | *(.text.do_softirq) | 59 | *(.text.do_softirq) |
| 58 | *(.text.sys_exit) | 60 | *(.text.sys_exit) |
| 59 | *(.text.do_sigaltstack) | 61 | *(.text.do_sigaltstack) |
