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#include <types.h>
11#include <api/failures.h>
12#include <object/structures.h>
13
14cap_t create_it_address_space(cap_t root_cnode_cap, v_region_t it_v_reg);
15void map_it_pt_cap(cap_t vspace_cap, cap_t pt_cap);
16void map_it_frame_cap(cap_t vspace_cap, cap_t frame_cap);
17void map_kernel_window(void);
18void map_kernel_frame(paddr_t paddr, pptr_t vaddr, vm_rights_t vm_rights);
19void activate_kernel_vspace(void);
20void write_it_asid_pool(cap_t it_ap_cap, cap_t it_lvl1pt_cap);
21
22
23/* ==================== BOOT CODE FINISHES HERE ==================== */
24#define IT_ASID 1
25
26void idle_thread(void);
27#define idleThreadStart (&idle_thread)
28
29struct lookupPTSlot_ret {
30    pte_t *ptSlot;
31    word_t ptBitsLeft;
32};
33
34typedef struct lookupPTSlot_ret lookupPTSlot_ret_t;
35
36struct findVSpaceForASID_ret {
37    exception_t status;
38    pte_t *vspace_root;
39};
40typedef struct findVSpaceForASID_ret findVSpaceForASID_ret_t;
41
42void copyGlobalMappings(pte_t *newlvl1pt);
43word_t *PURE lookupIPCBuffer(bool_t isReceiver, tcb_t *thread);
44lookupPTSlot_ret_t lookupPTSlot(pte_t *lvl1pt, vptr_t vptr);
45exception_t handleVMFault(tcb_t *thread, vm_fault_type_t vm_faultType);
46void unmapPageTable(asid_t, vptr_t vaddr, pte_t *pt);
47void unmapPage(vm_page_size_t page_size, asid_t asid, vptr_t vptr, pptr_t pptr);
48void deleteASID(asid_t asid, pte_t *vspace);
49void deleteASIDPool(asid_t asid_base, asid_pool_t *pool);
50bool_t CONST isValidVTableRoot(cap_t cap);
51exception_t checkValidIPCBuffer(vptr_t vptr, cap_t cap);
52vm_rights_t CONST maskVMRights(vm_rights_t vm_rights,
53                               seL4_CapRights_t cap_rights_mask);
54exception_t decodeRISCVMMUInvocation(word_t label, word_t length, cptr_t cptr,
55                                     cte_t *cte, cap_t cap, extra_caps_t extraCaps,
56                                     word_t *buffer);
57exception_t performPageTableInvocationMap(cap_t cap, cte_t *ctSlot,
58                                          pte_t lvl1pt, pte_t *ptSlot);
59exception_t performPageTableInvocationUnmap(cap_t cap, cte_t *ctSlot);
60exception_t performPageInvocationMapPTE(cap_t cap, cte_t *ctSlot,
61                                        pte_t pte, pte_t *base);
62exception_t performPageInvocationUnmap(cap_t cap, cte_t *ctSlot);
63void setVMRoot(tcb_t *tcb);
64
65#ifdef CONFIG_PRINTING
66void Arch_userStackTrace(tcb_t *tptr);
67#endif
68
69