1/*
2 * Copyright 2014, General Dynamics C4 Systems
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#pragma once
8
9#include <config.h>
10#include <sel4/macros.h>
11
12#define GDT_NULL    0
13#define GDT_CS_0    1
14#define GDT_DS_0    2
15#define GDT_CS_3    3
16#define GDT_DS_3    4
17#define GDT_TSS     5
18#define GDT_FS      6
19#define GDT_GS      7
20#define GDT_ENTRIES 8
21
22#define PDE_SIZE_BITS seL4_PageDirEntryBits
23#define PD_INDEX_BITS seL4_PageDirIndexBits
24#define PTE_SIZE_BITS seL4_PageTableEntryBits
25#define PT_INDEX_BITS seL4_PageTableIndexBits
26#define X86_GLOBAL_VSPACE_ROOT ia32KSGlobalPD
27#define X86_KERNEL_VSPACE_ROOT ia32KSGlobalPD
28typedef pde_t vspace_root_t;
29
30#define GET_VSPACE_ROOT_INDEX(x) ((x) >> (seL4_PageBits + PT_INDEX_BITS))
31
32#define PDE_PTR(r)     ((pde_t *)(r))
33#define PDE_PTR_PTR(r) ((pde_t **)(r))
34#define PDE_REF(p)     ((word_t)(p))
35
36#define PD_PTR(r)    ((pde_t *)(r))
37#define PD_REF(p)    ((word_t)(p))
38
39#define PTE_PTR(r)    ((pte_t *)(r))
40#define PTE_REF(p)    ((word_t)(p))
41
42#define PT_PTR(r)    ((pte_t *)(r))
43#define PT_REF(p)    ((word_t)(p))
44
45compile_assert(gdt_idt_ptr_packed,
46               sizeof(gdt_idt_ptr_t) == sizeof(uint16_t) * 3)
47
48struct asid_pool {
49    asid_map_t array[BIT(asidLowBits)];
50};
51
52typedef struct asid_pool asid_pool_t;
53
54#define ASID_POOL_INDEX_BITS    seL4_ASIDPoolIndexBits
55#define ASID_POOL_PTR(r)    ((asid_pool_t*)r)
56#define ASID_POOL_REF(p)    ((word_t)p)
57#define ASID_BITS           (asidHighBits + asidLowBits)
58#define nASIDPools          BIT(asidHighBits)
59#define ASID_LOW(a)         (a & MASK(asidLowBits))
60#define ASID_HIGH(a)        ((a >> asidLowBits) & MASK(asidHighBits))
61
62static inline asid_t CONST cap_frame_cap_get_capFMappedASID(cap_t cap)
63{
64    return
65        (cap_frame_cap_get_capFMappedASIDHigh(cap) << asidLowBits) +
66        cap_frame_cap_get_capFMappedASIDLow(cap);
67}
68
69static inline cap_t CONST cap_frame_cap_set_capFMappedASID(cap_t cap, word_t asid)
70{
71    cap = cap_frame_cap_set_capFMappedASIDLow(cap, ASID_LOW(asid));
72    return cap_frame_cap_set_capFMappedASIDHigh(cap, ASID_HIGH(asid));
73}
74
75static inline asid_t PURE cap_frame_cap_ptr_get_capFMappedASID(cap_t *cap)
76{
77    return cap_frame_cap_get_capFMappedASID(*cap);
78}
79
80static inline void cap_frame_cap_ptr_set_capFMappedASID(cap_t *cap, asid_t asid)
81{
82    *cap = cap_frame_cap_set_capFMappedASID(*cap, asid);
83}
84
85static inline asid_t PURE cap_get_capMappedASID(cap_t cap)
86{
87    cap_tag_t ctag;
88
89    ctag = cap_get_capType(cap);
90
91    switch (ctag) {
92    case cap_page_directory_cap:
93        return cap_page_directory_cap_get_capPDMappedASID(cap);
94
95#ifdef CONFIG_VTX
96    case cap_ept_pml4_cap:
97        return cap_ept_pml4_cap_get_capPML4MappedASID(cap);
98#endif
99
100    default:
101        fail("Invalid arch cap type");
102    }
103}
104
105static inline word_t CONST cap_get_modeCapSizeBits(cap_t cap)
106{
107    fail("Invalid mode cap type");
108}
109
110static inline bool_t CONST cap_get_modeCapIsPhysical(cap_t cap)
111{
112    fail("Invalid mode cap type");
113}
114
115static inline void *CONST cap_get_modeCapPtr(cap_t cap)
116{
117    fail("Invalid mode cap type");
118}
119
120