diff options
Diffstat (limited to 'include/asm-i386/processor.h')
-rw-r--r-- | include/asm-i386/processor.h | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h index 13ecf66b098c..29ad87e9123f 100644 --- a/include/asm-i386/processor.h +++ b/include/asm-i386/processor.h | |||
@@ -561,10 +561,20 @@ unsigned long get_wchan(struct task_struct *p); | |||
561 | (unsigned long)(&__ptr[THREAD_SIZE_LONGS]); \ | 561 | (unsigned long)(&__ptr[THREAD_SIZE_LONGS]); \ |
562 | }) | 562 | }) |
563 | 563 | ||
564 | /* | ||
565 | * The below -8 is to reserve 8 bytes on top of the ring0 stack. | ||
566 | * This is necessary to guarantee that the entire "struct pt_regs" | ||
567 | * is accessable even if the CPU haven't stored the SS/ESP registers | ||
568 | * on the stack (interrupt gate does not save these registers | ||
569 | * when switching to the same priv ring). | ||
570 | * Therefore beware: accessing the xss/esp fields of the | ||
571 | * "struct pt_regs" is possible, but they may contain the | ||
572 | * completely wrong values. | ||
573 | */ | ||
564 | #define task_pt_regs(task) \ | 574 | #define task_pt_regs(task) \ |
565 | ({ \ | 575 | ({ \ |
566 | struct pt_regs *__regs__; \ | 576 | struct pt_regs *__regs__; \ |
567 | __regs__ = (struct pt_regs *)KSTK_TOP((task)->thread_info); \ | 577 | __regs__ = (struct pt_regs *)(KSTK_TOP((task)->thread_info)-8); \ |
568 | __regs__ - 1; \ | 578 | __regs__ - 1; \ |
569 | }) | 579 | }) |
570 | 580 | ||