at v2.6.22-rc2 79 lines 1.9 kB view raw
1/* 2 * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) 3 * Licensed under the GPL 4 */ 5 6#ifndef __UM_PROCESSOR_I386_H 7#define __UM_PROCESSOR_I386_H 8 9#include "linux/string.h" 10#include "asm/host_ldt.h" 11#include "asm/segment.h" 12 13extern int host_has_xmm; 14extern int host_has_cmov; 15 16/* include faultinfo structure */ 17#include "sysdep/faultinfo.h" 18 19struct uml_tls_struct { 20 struct user_desc tls; 21 unsigned flushed:1; 22 unsigned present:1; 23}; 24 25struct arch_thread { 26 struct uml_tls_struct tls_array[GDT_ENTRY_TLS_ENTRIES]; 27 unsigned long debugregs[8]; 28 int debugregs_seq; 29 struct faultinfo faultinfo; 30}; 31 32#define INIT_ARCH_THREAD { \ 33 .tls_array = { [ 0 ... GDT_ENTRY_TLS_ENTRIES - 1 ] = \ 34 { .present = 0, .flushed = 0 } }, \ 35 .debugregs = { [ 0 ... 7 ] = 0 }, \ 36 .debugregs_seq = 0, \ 37 .faultinfo = { 0, 0, 0 } \ 38} 39 40static inline void arch_flush_thread(struct arch_thread *thread) 41{ 42 /* Clear any TLS still hanging */ 43 memset(&thread->tls_array, 0, sizeof(thread->tls_array)); 44} 45 46static inline void arch_copy_thread(struct arch_thread *from, 47 struct arch_thread *to) 48{ 49 memcpy(&to->tls_array, &from->tls_array, sizeof(from->tls_array)); 50} 51 52#include "asm/arch/user.h" 53 54/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ 55static inline void rep_nop(void) 56{ 57 __asm__ __volatile__("rep;nop": : :"memory"); 58} 59 60#define cpu_relax() rep_nop() 61 62/* 63 * Default implementation of macro that returns current 64 * instruction pointer ("program counter"). Stolen 65 * from asm-i386/processor.h 66 */ 67#define current_text_addr() \ 68 ({ void *pc; __asm__("movl $1f,%0\n1:":"=g" (pc)); pc; }) 69 70#define ARCH_IS_STACKGROW(address) \ 71 (address + 32 >= UPT_SP(&current->thread.regs.regs)) 72 73#define KSTK_EIP(tsk) KSTK_REG(tsk, EIP) 74#define KSTK_ESP(tsk) KSTK_REG(tsk, UESP) 75#define KSTK_EBP(tsk) KSTK_REG(tsk, EBP) 76 77#include "asm/processor-generic.h" 78 79#endif