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