31 #ifndef CPU_X86_MM_GDT_LAYOUT_H_
32 #define CPU_X86_MM_GDT_LAYOUT_H_
34 #include "prot-domains.h"
36 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__PAGING
41 #define GDT_NUM_FIXED_DESC 7
42 #elif X86_CONF_PROT_DOMAINS_MULTI_SEG
43 #define GDT_NUM_FIXED_DESC 11
45 #define GDT_NUM_FIXED_DESC 3
48 #define GDT_IDX_NULL 0
53 #define GDT_IDX_CODE_FLAT 1
58 #define GDT_IDX_DATA_FLAT 2
60 #if X86_CONF_PROT_DOMAINS != X86_CONF_PROT_DOMAINS__NONE
62 #define GDT_IDX_CODE 3
67 #define GDT_IDX_CODE_INT 4
69 #define GDT_IDX_STK_INT 5
71 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__PAGING
72 #define GDT_IDX_CODE_EXC GDT_IDX_CODE_FLAT
74 #define GDT_IDX_DATA 6
75 #define GDT_IDX_STK GDT_IDX_DATA
76 #define GDT_IDX_STK_EXC GDT_IDX_DATA_FLAT
82 #define GDT_IDX_CODE_EXC 6
84 #define GDT_IDX_DATA_KERN_EXC 7
86 #define GDT_IDX_DATA 8
93 #define GDT_IDX_STK_EXC 10
95 #if X86_CONF_PROT_DOMAINS == X86_CONF_PROT_DOMAINS__TSS
96 #define GDT_IDX_TSS(dom_id) (GDT_NUM_FIXED_DESC + (2 * (dom_id)))
97 #define GDT_IDX_LDT(dom_id) (GDT_NUM_FIXED_DESC + (2 * (dom_id)) + 1)
99 #define GDT_IDX_LDT(dom_id) (GDT_NUM_FIXED_DESC + (dom_id))
104 #define GDT_IDX_CODE GDT_IDX_CODE_FLAT
105 #define GDT_IDX_CODE_INT GDT_IDX_CODE_FLAT
106 #define GDT_IDX_CODE_EXC GDT_IDX_CODE_FLAT
107 #define GDT_IDX_DATA GDT_IDX_DATA_FLAT
108 #define GDT_IDX_STK GDT_IDX_DATA_FLAT
109 #define GDT_IDX_STK_INT GDT_IDX_DATA_FLAT
110 #define GDT_IDX_STK_EXC GDT_IDX_DATA_FLAT
113 #define GDT_SEL(idx, rpl) (((idx) << 3) | (rpl))
115 #define DT_SEL_GET_IDX(sel) ((sel) >> 3)
117 #define DT_SEL_GET_RPL(sel) ((sel) & 3)
119 #define GDT_SEL_NULL GDT_SEL(GDT_IDX_NULL, 0)
120 #define GDT_SEL_CODE_FLAT GDT_SEL(GDT_IDX_CODE_FLAT, PRIV_LVL_EXC)
121 #define GDT_SEL_DATA_FLAT GDT_SEL(GDT_IDX_DATA_FLAT, PRIV_LVL_EXC)
123 #define GDT_SEL_CODE GDT_SEL(GDT_IDX_CODE, PRIV_LVL_USER)
124 #define GDT_SEL_CODE_INT GDT_SEL(GDT_IDX_CODE_INT, PRIV_LVL_INT)
125 #define GDT_SEL_CODE_EXC GDT_SEL(GDT_IDX_CODE_EXC, PRIV_LVL_EXC)
127 #define GDT_SEL_DATA GDT_SEL(GDT_IDX_DATA, PRIV_LVL_EXC)
128 #define GDT_SEL_DATA_KERN_EXC GDT_SEL(GDT_IDX_DATA_KERN_EXC, PRIV_LVL_EXC)
130 #define GDT_SEL_STK GDT_SEL(GDT_IDX_STK, PRIV_LVL_USER)
131 #define GDT_SEL_STK_INT GDT_SEL(GDT_IDX_STK_INT, PRIV_LVL_INT)
132 #define GDT_SEL_STK_EXC GDT_SEL(GDT_IDX_STK_EXC, PRIV_LVL_EXC)
134 #define GDT_SEL_TSS(dom_id) GDT_SEL(GDT_IDX_TSS(dom_id), PRIV_LVL_USER)
135 #define GDT_SEL_LDT(dom_id) GDT_SEL(GDT_IDX_LDT(dom_id), PRIV_LVL_USER)