diff options
| author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2007-10-11 16:11:12 -0400 |
|---|---|---|
| committer | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2007-10-11 16:11:12 -0400 |
| commit | c7e872e7da5514d014707a407ea562d197cc0136 (patch) | |
| tree | eab8cc63a0ef14afbaa9b61153f30f7ed1a94e6f | |
| parent | b351d164e860d1ffffdc501c32f55dd1446c385b (diff) | |
lockdep: i386: connect the sysexit hook
Run the lockdep_sys_exit hook after all other C code on the syscall
return path.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | arch/x86/kernel/entry_32.S | 4 | ||||
| -rw-r--r-- | include/asm-x86/irqflags_32.h | 13 |
2 files changed, 17 insertions, 0 deletions
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 290b7bc82da3..8099fea0a72f 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -251,6 +251,7 @@ check_userspace: | |||
| 251 | jb resume_kernel # not returning to v8086 or userspace | 251 | jb resume_kernel # not returning to v8086 or userspace |
| 252 | 252 | ||
| 253 | ENTRY(resume_userspace) | 253 | ENTRY(resume_userspace) |
| 254 | LOCKDEP_SYS_EXIT | ||
| 254 | DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt | 255 | DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt |
| 255 | # setting need_resched or sigpending | 256 | # setting need_resched or sigpending |
| 256 | # between sampling and the iret | 257 | # between sampling and the iret |
| @@ -338,6 +339,7 @@ sysenter_past_esp: | |||
| 338 | jae syscall_badsys | 339 | jae syscall_badsys |
| 339 | call *sys_call_table(,%eax,4) | 340 | call *sys_call_table(,%eax,4) |
| 340 | movl %eax,PT_EAX(%esp) | 341 | movl %eax,PT_EAX(%esp) |
| 342 | LOCKDEP_SYS_EXIT | ||
| 341 | DISABLE_INTERRUPTS(CLBR_ANY) | 343 | DISABLE_INTERRUPTS(CLBR_ANY) |
| 342 | TRACE_IRQS_OFF | 344 | TRACE_IRQS_OFF |
| 343 | movl TI_flags(%ebp), %ecx | 345 | movl TI_flags(%ebp), %ecx |
| @@ -377,6 +379,7 @@ syscall_call: | |||
| 377 | call *sys_call_table(,%eax,4) | 379 | call *sys_call_table(,%eax,4) |
| 378 | movl %eax,PT_EAX(%esp) # store the return value | 380 | movl %eax,PT_EAX(%esp) # store the return value |
| 379 | syscall_exit: | 381 | syscall_exit: |
| 382 | LOCKDEP_SYS_EXIT | ||
| 380 | DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt | 383 | DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt |
| 381 | # setting need_resched or sigpending | 384 | # setting need_resched or sigpending |
| 382 | # between sampling and the iret | 385 | # between sampling and the iret |
| @@ -467,6 +470,7 @@ work_pending: | |||
| 467 | jz work_notifysig | 470 | jz work_notifysig |
| 468 | work_resched: | 471 | work_resched: |
| 469 | call schedule | 472 | call schedule |
| 473 | LOCKDEP_SYS_EXIT | ||
| 470 | DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt | 474 | DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt |
| 471 | # setting need_resched or sigpending | 475 | # setting need_resched or sigpending |
| 472 | # between sampling and the iret | 476 | # between sampling and the iret |
diff --git a/include/asm-x86/irqflags_32.h b/include/asm-x86/irqflags_32.h index eff8585cb741..d058b04e0083 100644 --- a/include/asm-x86/irqflags_32.h +++ b/include/asm-x86/irqflags_32.h | |||
| @@ -160,4 +160,17 @@ static inline int raw_irqs_disabled(void) | |||
| 160 | # define TRACE_IRQS_OFF | 160 | # define TRACE_IRQS_OFF |
| 161 | #endif | 161 | #endif |
| 162 | 162 | ||
| 163 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 164 | # define LOCKDEP_SYS_EXIT \ | ||
| 165 | pushl %eax; \ | ||
| 166 | pushl %ecx; \ | ||
| 167 | pushl %edx; \ | ||
| 168 | call lockdep_sys_exit; \ | ||
| 169 | popl %edx; \ | ||
| 170 | popl %ecx; \ | ||
| 171 | popl %eax; | ||
| 172 | #else | ||
| 173 | # define LOCKDEP_SYS_EXIT | ||
| 174 | #endif | ||
| 175 | |||
| 163 | #endif | 176 | #endif |
