]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4sys/include/ARCH-amd64/utcb.h
update
[l4.git] / l4 / pkg / l4sys / include / ARCH-amd64 / utcb.h
1 /**
2  * \file
3  * \brief   UTCB definitions for amd64.
4  * \ingroup l4_utcb_api
5  */
6 /*
7  * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
8  *               Alexander Warg <warg@os.inf.tu-dresden.de>
9  *     economic rights: Technische Universität Dresden (Germany)
10  *
11  * This file is part of TUD:OS and distributed under the terms of the
12  * GNU General Public License 2.
13  * Please see the COPYING-GPL-2 file for details.
14  *
15  * As a special exception, you may use this file as part of a free software
16  * library without restriction.  Specifically, if other files instantiate
17  * templates or use macros or inline functions from this file, or you compile
18  * this file and link it with other files to produce an executable, this
19  * file does not by itself cause the resulting executable to be covered by
20  * the GNU General Public License.  This exception does not however
21  * invalidate any other reasons why the executable file might be covered by
22  * the GNU General Public License.
23  */
24 /*****************************************************************************/
25 #ifndef __L4_SYS__INCLUDE__ARCH_AMD64__UTCB_H__
26 #define __L4_SYS__INCLUDE__ARCH_AMD64__UTCB_H__
27
28 #include <l4/sys/types.h>
29
30 /**
31  * \defgroup l4_utcb_api_amd64 amd64 Virtual Registers (UTCB)
32  * \ingroup  l4_utcb_api
33  */
34
35 /**
36  * \brief UTCB constants for AMD64
37  * \ingroup l4_utcb_api_amd64
38  */
39 enum L4_utcb_consts_amd64
40 {
41   L4_UTCB_EXCEPTION_REGS_SIZE    = 23,
42   L4_UTCB_GENERIC_DATA_SIZE      = 63,
43   L4_UTCB_GENERIC_BUFFERS_SIZE   = 58,
44
45   L4_UTCB_MSG_REGS_OFFSET        = 0,
46   L4_UTCB_BUF_REGS_OFFSET        = 64 * sizeof(l4_umword_t),
47   L4_UTCB_THREAD_REGS_OFFSET     = 123 * sizeof(l4_umword_t),
48
49   L4_UTCB_INHERIT_FPU            = 1UL << 24,
50   L4_UTCB_OFFSET                 = 1024,
51 };
52
53 /**
54  * \brief UTCB structure for exceptions.
55  * \ingroup l4_utcb_api_amd64
56  */
57 typedef struct l4_exc_regs_t
58 {
59   l4_umword_t r15;        /**< r15 */
60   l4_umword_t r14;        /**< r14 */
61   l4_umword_t r13;        /**< r13 */
62   l4_umword_t r12;        /**< r12 */
63   l4_umword_t r11;        /**< r11 */
64   l4_umword_t r10;        /**< r10 */
65   l4_umword_t r9;         /**< r9 */
66   l4_umword_t r8;         /**< r8 */
67   l4_umword_t rdi;        /**< rdi */
68   l4_umword_t rsi;        /**< rsi */
69   l4_umword_t rbp;        /**< rbp */
70   l4_umword_t pfa;        /**< page fault address */
71   l4_umword_t rbx;        /**< rbx */
72   l4_umword_t rdx;        /**< rdx */
73   l4_umword_t rcx;        /**< rcx */
74   l4_umword_t rax;        /**< rax */
75
76   l4_umword_t trapno;     /**< trap number */
77   l4_umword_t err;        /**< error code */
78   l4_umword_t ip;         /**< instruction pointer */
79   l4_umword_t dummy1;
80   l4_umword_t flags;      /**< rflags */
81   l4_umword_t sp;         /**< stack pointer */
82   l4_umword_t ss;         /**< stack segment register */
83 } l4_exc_regs_t;
84
85
86 #include_next <l4/sys/utcb.h>
87
88 /*
89  * ==================================================================
90  * Implementations.
91  */
92
93 L4_INLINE l4_utcb_t *l4_utcb_direct(void) L4_NOTHROW
94 {
95   l4_utcb_t *res;
96   __asm__ ( "mov %%gs:0, %0 \n" : "=r"(res));
97   return res;
98 }
99
100 L4_INLINE l4_umword_t l4_utcb_exc_pc(l4_exc_regs_t *u) L4_NOTHROW
101 {
102   return u->ip;
103 }
104
105 L4_INLINE void l4_utcb_exc_pc_set(l4_exc_regs_t *u, l4_addr_t pc) L4_NOTHROW
106 {
107   u->ip = pc;
108 }
109
110 L4_INLINE l4_umword_t l4_utcb_exc_typeval(l4_exc_regs_t *u) L4_NOTHROW
111 {
112   return u->trapno;
113 }
114
115 L4_INLINE int l4_utcb_exc_is_pf(l4_exc_regs_t *u) L4_NOTHROW
116 {
117   return u->trapno == 14;
118 }
119
120 L4_INLINE l4_addr_t l4_utcb_exc_pfa(l4_exc_regs_t *u) L4_NOTHROW
121 {
122   return (u->pfa & ~3) | (u->err & 2);
123 }
124
125 #endif /* ! __L4_SYS__INCLUDE__ARCH_AMD64__UTCB_H__ */