00001 /*****************************************************************************/ 00007 /*****************************************************************************/ 00008 #ifndef __L4_SYS__INCLUDE__ARCH_X86__UTCB_H__ 00009 #define __L4_SYS__INCLUDE__ARCH_X86__UTCB_H__ 00010 00011 #include <l4/sys/types.h> 00012 00023 struct l4_utcb_ex_regs_args 00024 { 00025 l4_threadid_t _res0; 00026 l4_threadid_t caphandler; 00027 l4_threadid_t _res1; 00028 }; 00029 00035 struct l4_utcb_task_new_args 00036 { 00037 l4_umword_t _res0; 00038 l4_threadid_t caphandler; 00039 l4_quota_desc_t quota; 00040 l4_threadid_t _res1; 00041 }; 00042 00046 enum { 00047 L4_EXCEPTION_REPLY_DW0_DEALIEN = 1, 00048 00049 L4_UTCB_EXCEPTION_REGS_SIZE = 16, 00050 L4_UTCB_GENERIC_DATA_SIZE = 32, 00051 00052 L4_UTCB_BUFFER_ACCEPTOR = 0, 00053 00054 L4_UTCB_INHERIT_FPU = 2, 00055 }; 00056 00062 struct l4_utcb_exception 00063 { 00064 l4_umword_t gs; 00065 l4_umword_t fs; 00067 l4_umword_t edi; 00068 l4_umword_t esi; 00069 l4_umword_t ebp; 00070 l4_umword_t pfa; 00071 l4_umword_t ebx; 00072 l4_umword_t edx; 00073 l4_umword_t ecx; 00074 l4_umword_t eax; 00076 l4_umword_t trapno; 00077 l4_umword_t err; 00079 l4_umword_t eip; 00080 l4_umword_t dummy1; 00081 l4_umword_t eflags; 00082 l4_umword_t esp; 00083 }; 00084 00085 00086 #include_next <l4/sys/utcb.h> 00087 00088 /* 00089 * ================================================================== 00090 * Implementations. 00091 */ 00092 00093 L4_INLINE l4_utcb_t *l4_utcb_get(void) 00094 { 00095 l4_utcb_t *utcb; 00096 __asm__ __volatile__ ("mov %%gs:0, %0" : "=r" (utcb)); 00097 return utcb; 00098 } 00099 00100 L4_INLINE l4_umword_t l4_utcb_exc_pc(l4_utcb_t *u) 00101 { 00102 return u->exc.eip; 00103 } 00104 00105 L4_INLINE l4_umword_t l4_utcb_exc_typeval(l4_utcb_t *u) 00106 { 00107 return u->exc.trapno; 00108 } 00109 00110 L4_INLINE int l4_utcb_exc_is_pf(l4_utcb_t *u) 00111 { 00112 return u->exc.trapno == 14; 00113 } 00114 00115 L4_INLINE l4_addr_t l4_utcb_exc_pfa(l4_utcb_t *u) 00116 { 00117 return (u->exc.pfa & ~3) | (u->exc.err & 2); 00118 } 00119 00120 #endif /* ! __L4_SYS__INCLUDE__ARCH_X86__UTCB_H__ */