diff options
Diffstat (limited to 'include/asm-i386/processor.h')
-rw-r--r-- | include/asm-i386/processor.h | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h index d0d8b0160090..37bef8ed7bed 100644 --- a/include/asm-i386/processor.h +++ b/include/asm-i386/processor.h | |||
@@ -203,9 +203,7 @@ static inline unsigned int cpuid_edx(unsigned int op) | |||
203 | return edx; | 203 | return edx; |
204 | } | 204 | } |
205 | 205 | ||
206 | #define load_cr3(pgdir) \ | 206 | #define load_cr3(pgdir) write_cr3(__pa(pgdir)) |
207 | asm volatile("movl %0,%%cr3": :"r" (__pa(pgdir))) | ||
208 | |||
209 | 207 | ||
210 | /* | 208 | /* |
211 | * Intel CPU features in CR4 | 209 | * Intel CPU features in CR4 |
@@ -232,22 +230,20 @@ extern unsigned long mmu_cr4_features; | |||
232 | 230 | ||
233 | static inline void set_in_cr4 (unsigned long mask) | 231 | static inline void set_in_cr4 (unsigned long mask) |
234 | { | 232 | { |
233 | unsigned cr4; | ||
235 | mmu_cr4_features |= mask; | 234 | mmu_cr4_features |= mask; |
236 | __asm__("movl %%cr4,%%eax\n\t" | 235 | cr4 = read_cr4(); |
237 | "orl %0,%%eax\n\t" | 236 | cr4 |= mask; |
238 | "movl %%eax,%%cr4\n" | 237 | write_cr4(cr4); |
239 | : : "irg" (mask) | ||
240 | :"ax"); | ||
241 | } | 238 | } |
242 | 239 | ||
243 | static inline void clear_in_cr4 (unsigned long mask) | 240 | static inline void clear_in_cr4 (unsigned long mask) |
244 | { | 241 | { |
242 | unsigned cr4; | ||
245 | mmu_cr4_features &= ~mask; | 243 | mmu_cr4_features &= ~mask; |
246 | __asm__("movl %%cr4,%%eax\n\t" | 244 | cr4 = read_cr4(); |
247 | "andl %0,%%eax\n\t" | 245 | cr4 &= ~mask; |
248 | "movl %%eax,%%cr4\n" | 246 | write_cr4(cr4); |
249 | : : "irg" (~mask) | ||
250 | :"ax"); | ||
251 | } | 247 | } |
252 | 248 | ||
253 | /* | 249 | /* |
@@ -281,6 +277,11 @@ static inline void clear_in_cr4 (unsigned long mask) | |||
281 | outb((data), 0x23); \ | 277 | outb((data), 0x23); \ |
282 | } while (0) | 278 | } while (0) |
283 | 279 | ||
280 | static inline void serialize_cpu(void) | ||
281 | { | ||
282 | __asm__ __volatile__ ("cpuid" : : : "ax", "bx", "cx", "dx"); | ||
283 | } | ||
284 | |||
284 | static inline void __monitor(const void *eax, unsigned long ecx, | 285 | static inline void __monitor(const void *eax, unsigned long ecx, |
285 | unsigned long edx) | 286 | unsigned long edx) |
286 | { | 287 | { |
@@ -454,6 +455,7 @@ struct thread_struct { | |||
454 | unsigned int saved_fs, saved_gs; | 455 | unsigned int saved_fs, saved_gs; |
455 | /* IO permissions */ | 456 | /* IO permissions */ |
456 | unsigned long *io_bitmap_ptr; | 457 | unsigned long *io_bitmap_ptr; |
458 | unsigned long iopl; | ||
457 | /* max allowed port in the bitmap, in bytes: */ | 459 | /* max allowed port in the bitmap, in bytes: */ |
458 | unsigned long io_bitmap_max; | 460 | unsigned long io_bitmap_max; |
459 | }; | 461 | }; |
@@ -474,7 +476,6 @@ struct thread_struct { | |||
474 | .esp0 = sizeof(init_stack) + (long)&init_stack, \ | 476 | .esp0 = sizeof(init_stack) + (long)&init_stack, \ |
475 | .ss0 = __KERNEL_DS, \ | 477 | .ss0 = __KERNEL_DS, \ |
476 | .ss1 = __KERNEL_CS, \ | 478 | .ss1 = __KERNEL_CS, \ |
477 | .ldt = GDT_ENTRY_LDT, \ | ||
478 | .io_bitmap_base = INVALID_IO_BITMAP_OFFSET, \ | 479 | .io_bitmap_base = INVALID_IO_BITMAP_OFFSET, \ |
479 | .io_bitmap = { [ 0 ... IO_BITMAP_LONGS] = ~0 }, \ | 480 | .io_bitmap = { [ 0 ... IO_BITMAP_LONGS] = ~0 }, \ |
480 | } | 481 | } |
@@ -511,6 +512,21 @@ static inline void load_esp0(struct tss_struct *tss, struct thread_struct *threa | |||
511 | : /* no output */ \ | 512 | : /* no output */ \ |
512 | :"r" (value)) | 513 | :"r" (value)) |
513 | 514 | ||
515 | /* | ||
516 | * Set IOPL bits in EFLAGS from given mask | ||
517 | */ | ||
518 | static inline void set_iopl_mask(unsigned mask) | ||
519 | { | ||
520 | unsigned int reg; | ||
521 | __asm__ __volatile__ ("pushfl;" | ||
522 | "popl %0;" | ||
523 | "andl %1, %0;" | ||
524 | "orl %2, %0;" | ||
525 | "pushl %0;" | ||
526 | "popfl" | ||
527 | : "=&r" (reg) | ||
528 | : "i" (~X86_EFLAGS_IOPL), "r" (mask)); | ||
529 | } | ||
514 | 530 | ||
515 | /* Forward declaration, a strange C thing */ | 531 | /* Forward declaration, a strange C thing */ |
516 | struct task_struct; | 532 | struct task_struct; |