diff options
-rw-r--r-- | arch/arm/Kconfig | 115 | ||||
-rw-r--r-- | arch/arm/include/asm/assembler.h | 49 | ||||
-rw-r--r-- | arch/arm/include/asm/ftrace.h | 1 | ||||
-rw-r--r-- | arch/arm/kernel/armksyms.c | 1 | ||||
-rw-r--r-- | arch/arm/kernel/entry-armv.S | 10 | ||||
-rw-r--r-- | arch/arm/kernel/entry-common.S | 19 | ||||
-rw-r--r-- | arch/arm/lib/bitops.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-netx/include/mach/entry-macro.S | 4 |
8 files changed, 73 insertions, 128 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index dc70660fe6bd..9746667c1973 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -965,18 +965,7 @@ config LOCAL_TIMERS | |||
965 | accounting to be spread across the timer interval, preventing a | 965 | accounting to be spread across the timer interval, preventing a |
966 | "thundering herd" at every timer tick. | 966 | "thundering herd" at every timer tick. |
967 | 967 | ||
968 | config PREEMPT | 968 | source kernel/Kconfig.preempt |
969 | bool "Preemptible Kernel (EXPERIMENTAL)" | ||
970 | depends on EXPERIMENTAL | ||
971 | help | ||
972 | This option reduces the latency of the kernel when reacting to | ||
973 | real-time or interactive events by allowing a low priority process to | ||
974 | be preempted even if it is in kernel mode executing a system call. | ||
975 | This allows applications to run more reliably even when the system is | ||
976 | under load. | ||
977 | |||
978 | Say Y here if you are building a kernel for a desktop, embedded | ||
979 | or real-time system. Say N if you are unsure. | ||
980 | 969 | ||
981 | config HZ | 970 | config HZ |
982 | int | 971 | int |
@@ -1395,107 +1384,7 @@ endmenu | |||
1395 | 1384 | ||
1396 | source "net/Kconfig" | 1385 | source "net/Kconfig" |
1397 | 1386 | ||
1398 | menu "Device Drivers" | 1387 | source "drivers/Kconfig" |
1399 | |||
1400 | source "drivers/base/Kconfig" | ||
1401 | |||
1402 | source "drivers/connector/Kconfig" | ||
1403 | |||
1404 | if ALIGNMENT_TRAP || !CPU_CP15_MMU | ||
1405 | source "drivers/mtd/Kconfig" | ||
1406 | endif | ||
1407 | |||
1408 | source "drivers/parport/Kconfig" | ||
1409 | |||
1410 | source "drivers/pnp/Kconfig" | ||
1411 | |||
1412 | source "drivers/block/Kconfig" | ||
1413 | |||
1414 | # misc before ide - BLK_DEV_SGIIOC4 depends on SGI_IOC4 | ||
1415 | |||
1416 | source "drivers/misc/Kconfig" | ||
1417 | |||
1418 | source "drivers/ide/Kconfig" | ||
1419 | |||
1420 | source "drivers/scsi/Kconfig" | ||
1421 | |||
1422 | source "drivers/ata/Kconfig" | ||
1423 | |||
1424 | source "drivers/md/Kconfig" | ||
1425 | |||
1426 | source "drivers/message/fusion/Kconfig" | ||
1427 | |||
1428 | source "drivers/ieee1394/Kconfig" | ||
1429 | |||
1430 | source "drivers/message/i2o/Kconfig" | ||
1431 | |||
1432 | source "drivers/net/Kconfig" | ||
1433 | |||
1434 | source "drivers/isdn/Kconfig" | ||
1435 | |||
1436 | # input before char - char/joystick depends on it. As does USB. | ||
1437 | |||
1438 | source "drivers/input/Kconfig" | ||
1439 | |||
1440 | source "drivers/char/Kconfig" | ||
1441 | |||
1442 | source "drivers/i2c/Kconfig" | ||
1443 | |||
1444 | source "drivers/spi/Kconfig" | ||
1445 | |||
1446 | source "drivers/gpio/Kconfig" | ||
1447 | |||
1448 | source "drivers/w1/Kconfig" | ||
1449 | |||
1450 | source "drivers/power/Kconfig" | ||
1451 | |||
1452 | source "drivers/hwmon/Kconfig" | ||
1453 | |||
1454 | source "drivers/thermal/Kconfig" | ||
1455 | |||
1456 | source "drivers/watchdog/Kconfig" | ||
1457 | |||
1458 | source "drivers/ssb/Kconfig" | ||
1459 | |||
1460 | #source "drivers/l3/Kconfig" | ||
1461 | |||
1462 | source "drivers/mfd/Kconfig" | ||
1463 | |||
1464 | source "drivers/media/Kconfig" | ||
1465 | |||
1466 | source "drivers/video/Kconfig" | ||
1467 | |||
1468 | source "sound/Kconfig" | ||
1469 | |||
1470 | source "drivers/hid/Kconfig" | ||
1471 | |||
1472 | source "drivers/usb/Kconfig" | ||
1473 | |||
1474 | source "drivers/uwb/Kconfig" | ||
1475 | |||
1476 | source "drivers/mmc/Kconfig" | ||
1477 | |||
1478 | source "drivers/memstick/Kconfig" | ||
1479 | |||
1480 | source "drivers/accessibility/Kconfig" | ||
1481 | |||
1482 | source "drivers/leds/Kconfig" | ||
1483 | |||
1484 | source "drivers/rtc/Kconfig" | ||
1485 | |||
1486 | source "drivers/dma/Kconfig" | ||
1487 | |||
1488 | source "drivers/dca/Kconfig" | ||
1489 | |||
1490 | source "drivers/auxdisplay/Kconfig" | ||
1491 | |||
1492 | source "drivers/regulator/Kconfig" | ||
1493 | |||
1494 | source "drivers/uio/Kconfig" | ||
1495 | |||
1496 | source "drivers/staging/Kconfig" | ||
1497 | |||
1498 | endmenu | ||
1499 | 1388 | ||
1500 | source "fs/Kconfig" | 1389 | source "fs/Kconfig" |
1501 | 1390 | ||
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 2b60c7d05770..00f46d9ce299 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
@@ -74,23 +74,56 @@ | |||
74 | * Enable and disable interrupts | 74 | * Enable and disable interrupts |
75 | */ | 75 | */ |
76 | #if __LINUX_ARM_ARCH__ >= 6 | 76 | #if __LINUX_ARM_ARCH__ >= 6 |
77 | .macro disable_irq | 77 | .macro disable_irq_notrace |
78 | cpsid i | 78 | cpsid i |
79 | .endm | 79 | .endm |
80 | 80 | ||
81 | .macro enable_irq | 81 | .macro enable_irq_notrace |
82 | cpsie i | 82 | cpsie i |
83 | .endm | 83 | .endm |
84 | #else | 84 | #else |
85 | .macro disable_irq | 85 | .macro disable_irq_notrace |
86 | msr cpsr_c, #PSR_I_BIT | SVC_MODE | 86 | msr cpsr_c, #PSR_I_BIT | SVC_MODE |
87 | .endm | 87 | .endm |
88 | 88 | ||
89 | .macro enable_irq | 89 | .macro enable_irq_notrace |
90 | msr cpsr_c, #SVC_MODE | 90 | msr cpsr_c, #SVC_MODE |
91 | .endm | 91 | .endm |
92 | #endif | 92 | #endif |
93 | 93 | ||
94 | .macro asm_trace_hardirqs_off | ||
95 | #if defined(CONFIG_TRACE_IRQFLAGS) | ||
96 | stmdb sp!, {r0-r3, ip, lr} | ||
97 | bl trace_hardirqs_off | ||
98 | ldmia sp!, {r0-r3, ip, lr} | ||
99 | #endif | ||
100 | .endm | ||
101 | |||
102 | .macro asm_trace_hardirqs_on_cond, cond | ||
103 | #if defined(CONFIG_TRACE_IRQFLAGS) | ||
104 | /* | ||
105 | * actually the registers should be pushed and pop'd conditionally, but | ||
106 | * after bl the flags are certainly clobbered | ||
107 | */ | ||
108 | stmdb sp!, {r0-r3, ip, lr} | ||
109 | bl\cond trace_hardirqs_on | ||
110 | ldmia sp!, {r0-r3, ip, lr} | ||
111 | #endif | ||
112 | .endm | ||
113 | |||
114 | .macro asm_trace_hardirqs_on | ||
115 | asm_trace_hardirqs_on_cond al | ||
116 | .endm | ||
117 | |||
118 | .macro disable_irq | ||
119 | disable_irq_notrace | ||
120 | asm_trace_hardirqs_off | ||
121 | .endm | ||
122 | |||
123 | .macro enable_irq | ||
124 | asm_trace_hardirqs_on | ||
125 | enable_irq_notrace | ||
126 | .endm | ||
94 | /* | 127 | /* |
95 | * Save the current IRQ state and disable IRQs. Note that this macro | 128 | * Save the current IRQ state and disable IRQs. Note that this macro |
96 | * assumes FIQs are enabled, and that the processor is in SVC mode. | 129 | * assumes FIQs are enabled, and that the processor is in SVC mode. |
@@ -104,10 +137,16 @@ | |||
104 | * Restore interrupt state previously stored in a register. We don't | 137 | * Restore interrupt state previously stored in a register. We don't |
105 | * guarantee that this will preserve the flags. | 138 | * guarantee that this will preserve the flags. |
106 | */ | 139 | */ |
107 | .macro restore_irqs, oldcpsr | 140 | .macro restore_irqs_notrace, oldcpsr |
108 | msr cpsr_c, \oldcpsr | 141 | msr cpsr_c, \oldcpsr |
109 | .endm | 142 | .endm |
110 | 143 | ||
144 | .macro restore_irqs, oldcpsr | ||
145 | tst \oldcpsr, #PSR_I_BIT | ||
146 | asm_trace_hardirqs_on_cond eq | ||
147 | restore_irqs_notrace \oldcpsr | ||
148 | .endm | ||
149 | |||
111 | #define USER(x...) \ | 150 | #define USER(x...) \ |
112 | 9999: x; \ | 151 | 9999: x; \ |
113 | .section __ex_table,"a"; \ | 152 | .section __ex_table,"a"; \ |
diff --git a/arch/arm/include/asm/ftrace.h b/arch/arm/include/asm/ftrace.h index 39c8bc1a006a..0d4c478e01b6 100644 --- a/arch/arm/include/asm/ftrace.h +++ b/arch/arm/include/asm/ftrace.h | |||
@@ -7,6 +7,7 @@ | |||
7 | 7 | ||
8 | #ifndef __ASSEMBLY__ | 8 | #ifndef __ASSEMBLY__ |
9 | extern void mcount(void); | 9 | extern void mcount(void); |
10 | extern void __gnu_mcount_nc(void); | ||
10 | #endif | 11 | #endif |
11 | 12 | ||
12 | #endif | 13 | #endif |
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index 531e1860e546..0e627705f746 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c | |||
@@ -186,4 +186,5 @@ EXPORT_SYMBOL(_find_next_bit_be); | |||
186 | 186 | ||
187 | #ifdef CONFIG_FUNCTION_TRACER | 187 | #ifdef CONFIG_FUNCTION_TRACER |
188 | EXPORT_SYMBOL(mcount); | 188 | EXPORT_SYMBOL(mcount); |
189 | EXPORT_SYMBOL(__gnu_mcount_nc); | ||
189 | #endif | 190 | #endif |
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 468425f937dd..3d727a8a23bc 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -161,6 +161,8 @@ ENDPROC(__und_invalid) | |||
161 | @ r4 - orig_r0 (see pt_regs definition in ptrace.h) | 161 | @ r4 - orig_r0 (see pt_regs definition in ptrace.h) |
162 | @ | 162 | @ |
163 | stmia r5, {r0 - r4} | 163 | stmia r5, {r0 - r4} |
164 | |||
165 | asm_trace_hardirqs_off | ||
164 | .endm | 166 | .endm |
165 | 167 | ||
166 | .align 5 | 168 | .align 5 |
@@ -215,9 +217,6 @@ ENDPROC(__dabt_svc) | |||
215 | __irq_svc: | 217 | __irq_svc: |
216 | svc_entry | 218 | svc_entry |
217 | 219 | ||
218 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
219 | bl trace_hardirqs_off | ||
220 | #endif | ||
221 | #ifdef CONFIG_PREEMPT | 220 | #ifdef CONFIG_PREEMPT |
222 | get_thread_info tsk | 221 | get_thread_info tsk |
223 | ldr r8, [tsk, #TI_PREEMPT] @ get preempt count | 222 | ldr r8, [tsk, #TI_PREEMPT] @ get preempt count |
@@ -391,6 +390,8 @@ ENDPROC(__pabt_svc) | |||
391 | @ Clear FP to mark the first stack frame | 390 | @ Clear FP to mark the first stack frame |
392 | @ | 391 | @ |
393 | zero_fp | 392 | zero_fp |
393 | |||
394 | asm_trace_hardirqs_off | ||
394 | .endm | 395 | .endm |
395 | 396 | ||
396 | .macro kuser_cmpxchg_check | 397 | .macro kuser_cmpxchg_check |
@@ -445,9 +446,6 @@ __irq_usr: | |||
445 | usr_entry | 446 | usr_entry |
446 | kuser_cmpxchg_check | 447 | kuser_cmpxchg_check |
447 | 448 | ||
448 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
449 | bl trace_hardirqs_off | ||
450 | #endif | ||
451 | get_thread_info tsk | 449 | get_thread_info tsk |
452 | #ifdef CONFIG_PREEMPT | 450 | #ifdef CONFIG_PREEMPT |
453 | ldr r8, [tsk, #TI_PREEMPT] @ get preempt count | 451 | ldr r8, [tsk, #TI_PREEMPT] @ get preempt count |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index a0540c9f1f0c..df19e8bf2e4a 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
@@ -118,6 +118,25 @@ ftrace_call: | |||
118 | 118 | ||
119 | #else | 119 | #else |
120 | 120 | ||
121 | ENTRY(__gnu_mcount_nc) | ||
122 | stmdb sp!, {r0-r3, lr} | ||
123 | ldr r0, =ftrace_trace_function | ||
124 | ldr r2, [r0] | ||
125 | adr r0, ftrace_stub | ||
126 | cmp r0, r2 | ||
127 | bne gnu_trace | ||
128 | ldmia sp!, {r0-r3, ip, lr} | ||
129 | bx ip | ||
130 | |||
131 | gnu_trace: | ||
132 | ldr r1, [sp, #20] @ lr of instrumented routine | ||
133 | mov r0, lr | ||
134 | sub r0, r0, #MCOUNT_INSN_SIZE | ||
135 | mov lr, pc | ||
136 | mov pc, r2 | ||
137 | ldmia sp!, {r0-r3, ip, lr} | ||
138 | bx ip | ||
139 | |||
121 | ENTRY(mcount) | 140 | ENTRY(mcount) |
122 | stmdb sp!, {r0-r3, lr} | 141 | stmdb sp!, {r0-r3, lr} |
123 | ldr r0, =ftrace_trace_function | 142 | ldr r0, =ftrace_trace_function |
diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h index c7f2627385e7..d42252918bfb 100644 --- a/arch/arm/lib/bitops.h +++ b/arch/arm/lib/bitops.h | |||
@@ -60,8 +60,8 @@ | |||
60 | tst r2, r0, lsl r3 | 60 | tst r2, r0, lsl r3 |
61 | \instr r2, r2, r0, lsl r3 | 61 | \instr r2, r2, r0, lsl r3 |
62 | \store r2, [r1] | 62 | \store r2, [r1] |
63 | restore_irqs ip | ||
64 | moveq r0, #0 | 63 | moveq r0, #0 |
64 | restore_irqs ip | ||
65 | mov pc, lr | 65 | mov pc, lr |
66 | .endm | 66 | .endm |
67 | #endif | 67 | #endif |
diff --git a/arch/arm/mach-netx/include/mach/entry-macro.S b/arch/arm/mach-netx/include/mach/entry-macro.S index a1952a0feda6..844f1f9acbdf 100644 --- a/arch/arm/mach-netx/include/mach/entry-macro.S +++ b/arch/arm/mach-netx/include/mach/entry-macro.S | |||
@@ -24,15 +24,13 @@ | |||
24 | .endm | 24 | .endm |
25 | 25 | ||
26 | .macro get_irqnr_preamble, base, tmp | 26 | .macro get_irqnr_preamble, base, tmp |
27 | ldr \base, =io_p2v(0x001ff000) | ||
27 | .endm | 28 | .endm |
28 | 29 | ||
29 | .macro arch_ret_to_user, tmp1, tmp2 | 30 | .macro arch_ret_to_user, tmp1, tmp2 |
30 | .endm | 31 | .endm |
31 | 32 | ||
32 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | 33 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
33 | mov \base, #io_p2v(0x00100000) | ||
34 | add \base, \base, #0x000ff000 | ||
35 | |||
36 | ldr \irqstat, [\base, #0] | 34 | ldr \irqstat, [\base, #0] |
37 | clz \irqnr, \irqstat | 35 | clz \irqnr, \irqstat |
38 | rsb \irqnr, \irqnr, #31 | 36 | rsb \irqnr, \irqnr, #31 |