diff options
Diffstat (limited to 'arch/i386/mm/fault.c')
-rw-r--r-- | arch/i386/mm/fault.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/arch/i386/mm/fault.c b/arch/i386/mm/fault.c index 0ce86168a0b1..5e17a3f43b41 100644 --- a/arch/i386/mm/fault.c +++ b/arch/i386/mm/fault.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
28 | #include <asm/desc.h> | 28 | #include <asm/desc.h> |
29 | #include <asm/kdebug.h> | 29 | #include <asm/kdebug.h> |
30 | #include <asm/segment.h> | ||
30 | 31 | ||
31 | extern void die(const char *,struct pt_regs *,long); | 32 | extern void die(const char *,struct pt_regs *,long); |
32 | 33 | ||
@@ -113,10 +114,10 @@ static inline unsigned long get_segment_eip(struct pt_regs *regs, | |||
113 | } | 114 | } |
114 | 115 | ||
115 | /* The standard kernel/user address space limit. */ | 116 | /* The standard kernel/user address space limit. */ |
116 | *eip_limit = (seg & 3) ? USER_DS.seg : KERNEL_DS.seg; | 117 | *eip_limit = user_mode(regs) ? USER_DS.seg : KERNEL_DS.seg; |
117 | 118 | ||
118 | /* By far the most common cases. */ | 119 | /* By far the most common cases. */ |
119 | if (likely(seg == __USER_CS || seg == __KERNEL_CS)) | 120 | if (likely(SEGMENT_IS_FLAT_CODE(seg))) |
120 | return eip; | 121 | return eip; |
121 | 122 | ||
122 | /* Check the segment exists, is within the current LDT/GDT size, | 123 | /* Check the segment exists, is within the current LDT/GDT size, |
@@ -430,11 +431,7 @@ good_area: | |||
430 | write = 0; | 431 | write = 0; |
431 | switch (error_code & 3) { | 432 | switch (error_code & 3) { |
432 | default: /* 3: write, present */ | 433 | default: /* 3: write, present */ |
433 | #ifdef TEST_VERIFY_AREA | 434 | /* fall through */ |
434 | if (regs->cs == KERNEL_CS) | ||
435 | printk("WP fault at %08lx\n", regs->eip); | ||
436 | #endif | ||
437 | /* fall through */ | ||
438 | case 2: /* write, not present */ | 435 | case 2: /* write, not present */ |
439 | if (!(vma->vm_flags & VM_WRITE)) | 436 | if (!(vma->vm_flags & VM_WRITE)) |
440 | goto bad_area; | 437 | goto bad_area; |