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 <types.h>
11#include <api/failures.h>
12#include <object/structures.h>
13
14/* PD slot reserved for storing the PD's allocated hardware ASID */
15#define PD_ASID_SLOT (0xff000000 >> (PT_INDEX_BITS + PAGE_BITS))
16
17enum pde_pte_tag {
18    ME_PDE,
19    ME_PTE
20};
21typedef word_t pde_pte_tag_t;
22
23struct createMappingEntries_ret {
24    exception_t status;
25    pde_pte_tag_t tag;
26    void *pde_pte_ptr;
27    unsigned int offset;
28    word_t size;
29};
30typedef struct createMappingEntries_ret createMappingEntries_ret_t;
31
32struct findPDForASID_ret {
33    exception_t status;
34    pde_t *pd;
35};
36typedef struct findPDForASID_ret findPDForASID_ret_t;
37
38struct lookupPTSlot_ret {
39    exception_t status;
40    pte_t *ptSlot;
41};
42typedef struct lookupPTSlot_ret lookupPTSlot_ret_t;
43
44#ifdef CONFIG_ARM_HYPERVISOR_SUPPORT
45hw_asid_t getHWASID(asid_t asid);
46#endif
47void copyGlobalMappings(pde_t *newPD);
48findPDForASID_ret_t findPDForASID(asid_t asid);
49lookupPTSlot_ret_t lookupPTSlot(pde_t *pd, vptr_t vptr);
50pde_t *CONST lookupPDSlot(pde_t *pd, vptr_t vptr);
51void deleteASIDPool(asid_t base, asid_pool_t *pool);
52void deleteASID(asid_t asid, pde_t *pd);
53void unmapPageTable(asid_t asid, vptr_t vaddr, pte_t *pt);
54void unmapPage(vm_page_size_t page_size, asid_t asid, vptr_t vptr, void *pptr);
55hw_asid_t getHWASID(asid_t asid);
56hw_asid_t findFreeHWASID(void);
57void flushPage(vm_page_size_t page_size, pde_t *pd, asid_t asid, word_t vptr);
58void flushTable(pde_t *pd, asid_t asid, word_t vptr, pte_t *pt);
59void flushSpace(asid_t asid);
60void invalidateTLBByASID(asid_t asid);
61
62bool_t CONST isIOSpaceFrameCap(cap_t cap);
63
64/* Reserved memory ranges */
65static const region_t BOOT_RODATA mode_reserved_region[] = {
66    {
67        (PD_ASID_SLOT + 0) << ARMSectionBits,
68                           (PD_ASID_SLOT + 1) << ARMSectionBits
69    }
70};
71#define MODE_RESERVED ARRAY_SIZE(mode_reserved_region)
72
73