aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386/mm/fault.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/mm/fault.c')
-rw-r--r--arch/i386/mm/fault.c11
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
31extern void die(const char *,struct pt_regs *,long); 32extern 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;