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