diff options
Diffstat (limited to 'include/asm-i386')
-rw-r--r-- | include/asm-i386/ptrace.h | 5 | ||||
-rw-r--r-- | include/asm-i386/segment.h | 17 |
2 files changed, 20 insertions, 2 deletions
diff --git a/include/asm-i386/ptrace.h b/include/asm-i386/ptrace.h index 30a442ec2059..21bb91679c82 100644 --- a/include/asm-i386/ptrace.h +++ b/include/asm-i386/ptrace.h | |||
@@ -60,6 +60,7 @@ struct pt_regs { | |||
60 | #ifdef __KERNEL__ | 60 | #ifdef __KERNEL__ |
61 | 61 | ||
62 | #include <asm/vm86.h> | 62 | #include <asm/vm86.h> |
63 | #include <asm/segment.h> | ||
63 | 64 | ||
64 | struct task_struct; | 65 | struct task_struct; |
65 | extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code); | 66 | extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code); |
@@ -73,11 +74,11 @@ extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int erro | |||
73 | */ | 74 | */ |
74 | static inline int user_mode(struct pt_regs *regs) | 75 | static inline int user_mode(struct pt_regs *regs) |
75 | { | 76 | { |
76 | return (regs->xcs & 3) != 0; | 77 | return (regs->xcs & SEGMENT_RPL_MASK) == USER_RPL; |
77 | } | 78 | } |
78 | static inline int user_mode_vm(struct pt_regs *regs) | 79 | static inline int user_mode_vm(struct pt_regs *regs) |
79 | { | 80 | { |
80 | return ((regs->xcs & 3) | (regs->eflags & VM_MASK)) != 0; | 81 | return ((regs->xcs & SEGMENT_RPL_MASK) | (regs->eflags & VM_MASK)) >= USER_RPL; |
81 | } | 82 | } |
82 | #define instruction_pointer(regs) ((regs)->eip) | 83 | #define instruction_pointer(regs) ((regs)->eip) |
83 | extern unsigned long profile_pc(struct pt_regs *regs); | 84 | extern unsigned long profile_pc(struct pt_regs *regs); |
diff --git a/include/asm-i386/segment.h b/include/asm-i386/segment.h index faf995307b9e..b7ab59685ba7 100644 --- a/include/asm-i386/segment.h +++ b/include/asm-i386/segment.h | |||
@@ -83,6 +83,11 @@ | |||
83 | 83 | ||
84 | #define GDT_SIZE (GDT_ENTRIES * 8) | 84 | #define GDT_SIZE (GDT_ENTRIES * 8) |
85 | 85 | ||
86 | /* Matches __KERNEL_CS and __USER_CS (they must be 2 entries apart) */ | ||
87 | #define SEGMENT_IS_FLAT_CODE(x) (((x) & 0xec) == GDT_ENTRY_KERNEL_CS * 8) | ||
88 | /* Matches PNP_CS32 and PNP_CS16 (they must be consecutive) */ | ||
89 | #define SEGMENT_IS_PNP_CODE(x) (((x) & 0xf4) == GDT_ENTRY_PNPBIOS_BASE * 8) | ||
90 | |||
86 | /* Simple and small GDT entries for booting only */ | 91 | /* Simple and small GDT entries for booting only */ |
87 | 92 | ||
88 | #define GDT_ENTRY_BOOT_CS 2 | 93 | #define GDT_ENTRY_BOOT_CS 2 |
@@ -112,4 +117,16 @@ | |||
112 | */ | 117 | */ |
113 | #define IDT_ENTRIES 256 | 118 | #define IDT_ENTRIES 256 |
114 | 119 | ||
120 | /* Bottom two bits of selector give the ring privilege level */ | ||
121 | #define SEGMENT_RPL_MASK 0x3 | ||
122 | /* Bit 2 is table indicator (LDT/GDT) */ | ||
123 | #define SEGMENT_TI_MASK 0x4 | ||
124 | |||
125 | /* User mode is privilege level 3 */ | ||
126 | #define USER_RPL 0x3 | ||
127 | /* LDT segment has TI set, GDT has it cleared */ | ||
128 | #define SEGMENT_LDT 0x4 | ||
129 | #define SEGMENT_GDT 0x0 | ||
130 | |||
131 | #define get_kernel_rpl() 0 | ||
115 | #endif | 132 | #endif |