00001 /*****************************************************************************/ 00007 /*****************************************************************************/ 00008 #ifndef __L4_SYS__INCLUDE__ARCH_ARM__UTCB_H__ 00009 #define __L4_SYS__INCLUDE__ARCH_ARM__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 = 20, 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 pfa; 00065 l4_umword_t err; 00067 l4_umword_t r[13]; 00068 l4_umword_t cpsr; 00069 l4_umword_t sp; 00070 l4_umword_t ulr; 00071 l4_umword_t _dummy1; 00072 l4_umword_t pc; 00073 }; 00074 00075 #include_next <l4/sys/utcb.h> 00076 00077 /* 00078 * ================================================================== 00079 * Implementations. 00080 */ 00081 00082 #ifdef __GNUC__ 00083 L4_INLINE l4_utcb_t *l4_utcb_get(void) 00084 { 00085 register l4_utcb_t *utcb asm ("r0"); 00086 asm volatile ("mov lr, pc \n" 00087 "mov pc, #0xffffff00 \n" 00088 : "=r"(utcb) : : "lr"); 00089 return utcb; 00090 } 00091 #endif 00092 00093 L4_INLINE l4_umword_t l4_utcb_exc_pc(l4_utcb_t *u) 00094 { 00095 return u->exc.pc; 00096 } 00097 00098 L4_INLINE l4_umword_t l4_utcb_exc_typeval(l4_utcb_t *u) 00099 { 00100 return u->exc.err; 00101 } 00102 00103 L4_INLINE int l4_utcb_exc_is_pf(l4_utcb_t *u) 00104 { 00105 return u->exc.err & 0x00010000; 00106 } 00107 00108 L4_INLINE l4_addr_t l4_utcb_exc_pfa(l4_utcb_t *u) 00109 { 00110 return (u->exc.pfa & ~3) | (!(u->exc.err & 0x00020000) << 1); 00111 } 00112 00113 #endif /* ! __L4_SYS__INCLUDE__ARCH_ARM__UTCB_H__ */