aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/Kconfig115
-rw-r--r--arch/arm/include/asm/assembler.h49
-rw-r--r--arch/arm/include/asm/ftrace.h1
-rw-r--r--arch/arm/kernel/armksyms.c1
-rw-r--r--arch/arm/kernel/entry-armv.S10
-rw-r--r--arch/arm/kernel/entry-common.S19
-rw-r--r--arch/arm/lib/bitops.h2
-rw-r--r--arch/arm/mach-netx/include/mach/entry-macro.S4
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
968config PREEMPT 968source 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
981config HZ 970config HZ
982 int 971 int
@@ -1395,107 +1384,7 @@ endmenu
1395 1384
1396source "net/Kconfig" 1385source "net/Kconfig"
1397 1386
1398menu "Device Drivers" 1387source "drivers/Kconfig"
1399
1400source "drivers/base/Kconfig"
1401
1402source "drivers/connector/Kconfig"
1403
1404if ALIGNMENT_TRAP || !CPU_CP15_MMU
1405source "drivers/mtd/Kconfig"
1406endif
1407
1408source "drivers/parport/Kconfig"
1409
1410source "drivers/pnp/Kconfig"
1411
1412source "drivers/block/Kconfig"
1413
1414# misc before ide - BLK_DEV_SGIIOC4 depends on SGI_IOC4
1415
1416source "drivers/misc/Kconfig"
1417
1418source "drivers/ide/Kconfig"
1419
1420source "drivers/scsi/Kconfig"
1421
1422source "drivers/ata/Kconfig"
1423
1424source "drivers/md/Kconfig"
1425
1426source "drivers/message/fusion/Kconfig"
1427
1428source "drivers/ieee1394/Kconfig"
1429
1430source "drivers/message/i2o/Kconfig"
1431
1432source "drivers/net/Kconfig"
1433
1434source "drivers/isdn/Kconfig"
1435
1436# input before char - char/joystick depends on it. As does USB.
1437
1438source "drivers/input/Kconfig"
1439
1440source "drivers/char/Kconfig"
1441
1442source "drivers/i2c/Kconfig"
1443
1444source "drivers/spi/Kconfig"
1445
1446source "drivers/gpio/Kconfig"
1447
1448source "drivers/w1/Kconfig"
1449
1450source "drivers/power/Kconfig"
1451
1452source "drivers/hwmon/Kconfig"
1453
1454source "drivers/thermal/Kconfig"
1455
1456source "drivers/watchdog/Kconfig"
1457
1458source "drivers/ssb/Kconfig"
1459
1460#source "drivers/l3/Kconfig"
1461
1462source "drivers/mfd/Kconfig"
1463
1464source "drivers/media/Kconfig"
1465
1466source "drivers/video/Kconfig"
1467
1468source "sound/Kconfig"
1469
1470source "drivers/hid/Kconfig"
1471
1472source "drivers/usb/Kconfig"
1473
1474source "drivers/uwb/Kconfig"
1475
1476source "drivers/mmc/Kconfig"
1477
1478source "drivers/memstick/Kconfig"
1479
1480source "drivers/accessibility/Kconfig"
1481
1482source "drivers/leds/Kconfig"
1483
1484source "drivers/rtc/Kconfig"
1485
1486source "drivers/dma/Kconfig"
1487
1488source "drivers/dca/Kconfig"
1489
1490source "drivers/auxdisplay/Kconfig"
1491
1492source "drivers/regulator/Kconfig"
1493
1494source "drivers/uio/Kconfig"
1495
1496source "drivers/staging/Kconfig"
1497
1498endmenu
1499 1388
1500source "fs/Kconfig" 1389source "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...) \
1129999: x; \ 1519999: 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__
9extern void mcount(void); 9extern void mcount(void);
10extern 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
188EXPORT_SYMBOL(mcount); 188EXPORT_SYMBOL(mcount);
189EXPORT_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
121ENTRY(__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
131gnu_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
121ENTRY(mcount) 140ENTRY(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