1/* 2 * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230) 3 * Copyright 2015, 2016 Hesham Almatary <heshamelmatary@gmail.com> 4 * 5 * SPDX-License-Identifier: GPL-2.0-only 6 */ 7 8#pragma once 9 10#ifndef __ASSEMBLER__ 11#include <config.h> 12#include <assert.h> 13#include <util.h> 14#include <api/types.h> 15#include <arch/types.h> 16#include <arch/object/structures_gen.h> 17#include <arch/machine/hardware.h> 18#include <arch/machine/registerset.h> 19#include <mode/object/structures.h> 20 21#define tcbArchCNodeEntries tcbCNodeEntries 22 23struct asid_pool { 24 pte_t *array[BIT(asidLowBits)]; 25}; 26 27typedef struct asid_pool asid_pool_t; 28 29#define ASID_POOL_PTR(r) ((asid_pool_t*)r) 30#define ASID_POOL_REF(p) ((word_t)p) 31#define ASID_BITS (asidHighBits + asidLowBits) 32#define nASIDPools BIT(asidHighBits) 33#define ASID_LOW(a) (a & MASK(asidLowBits)) 34#define ASID_HIGH(a) ((a >> asidLowBits) & MASK(asidHighBits)) 35 36typedef struct arch_tcb { 37 user_context_t tcbContext; 38} arch_tcb_t; 39 40enum vm_rights { 41 VMKernelOnly = 1, 42 VMReadOnly = 2, 43 VMReadWrite = 3 44}; 45typedef word_t vm_rights_t; 46 47typedef pte_t vspace_root_t; 48 49/* Generic fastpath.c code expects pde_t for stored_hw_asid 50 * that's a workaround in the time being. 51 */ 52typedef pte_t pde_t; 53 54#define PTE_PTR(r) ((pte_t *)(r)) 55#define PTE_REF(p) ((word_t)(p)) 56 57#define PT_SIZE_BITS 12 58#define PT_PTR(r) ((pte_t *)(r)) 59#define PT_REF(p) ((word_t)(p)) 60 61#define PTE_SIZE_BITS seL4_PageTableEntryBits 62#define PT_INDEX_BITS seL4_PageTableIndexBits 63 64#define WORD_BITS (8 * sizeof(word_t)) 65#define WORD_PTR(r) ((word_t *)(r)) 66 67static inline bool_t CONST cap_get_archCapIsPhysical(cap_t cap) 68{ 69 cap_tag_t ctag; 70 71 ctag = cap_get_capType(cap); 72 73 switch (ctag) { 74 75 case cap_frame_cap: 76 return true; 77 78 case cap_page_table_cap: 79 return true; 80 81 case cap_asid_control_cap: 82 return false; 83 84 case cap_asid_pool_cap: 85 return true; 86 87 default: 88 /* unreachable */ 89 return false; 90 } 91} 92 93static inline word_t CONST cap_get_archCapSizeBits(cap_t cap) 94{ 95 cap_tag_t ctag; 96 97 ctag = cap_get_capType(cap); 98 99 switch (ctag) { 100 case cap_frame_cap: 101 return pageBitsForSize(cap_frame_cap_get_capFSize(cap)); 102 103 case cap_page_table_cap: 104 return PT_SIZE_BITS; 105 106 case cap_asid_control_cap: 107 return 0; 108 109 case cap_asid_pool_cap: 110 return seL4_ASIDPoolBits; 111 112 default: 113 assert(!"Unknown cap type"); 114 /* Unreachable, but GCC can't figure that out */ 115 return 0; 116 } 117} 118 119static inline void *CONST cap_get_archCapPtr(cap_t cap) 120{ 121 cap_tag_t ctag; 122 123 ctag = cap_get_capType(cap); 124 125 switch (ctag) { 126 127 case cap_frame_cap: 128 return (void *)(cap_frame_cap_get_capFBasePtr(cap)); 129 130 case cap_page_table_cap: 131 return PT_PTR(cap_page_table_cap_get_capPTBasePtr(cap)); 132 133 case cap_asid_control_cap: 134 return NULL; 135 136 case cap_asid_pool_cap: 137 return ASID_POOL_PTR(cap_asid_pool_cap_get_capASIDPool(cap)); 138 139 default: 140 assert(!"Unknown cap type"); 141 /* Unreachable, but GCC can't figure that out */ 142 return NULL; 143 } 144} 145 146static inline bool_t CONST Arch_isCapRevocable(cap_t derivedCap, cap_t srcCap) 147{ 148 return false; 149} 150 151#endif /* !__ASSEMBLER__ */ 152 153