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