1/*
2 * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#pragma once
8
9#include <config.h>
10#include <object/structures.h>
11
12#ifdef CONFIG_VTX
13
14struct EPTPDPTMapped_ret {
15    ept_pml4e_t *pml4;
16    ept_pml4e_t *pml4Slot;
17    exception_t status;
18};
19typedef struct EPTPDPTMapped_ret EPTPDPTMapped_ret_t;
20
21struct EPTPageDirectoryMapped_ret {
22    ept_pml4e_t *pml4;
23    ept_pdpte_t *pdptSlot;
24    exception_t status;
25};
26typedef struct EPTPageDirectoryMapped_ret EPTPageDirectoryMapped_ret_t;
27
28struct EPTPageTableMapped_ret {
29    ept_pml4e_t *pml4;
30    ept_pde_t *pdSlot;
31    exception_t status;
32};
33typedef struct EPTPageTableMapped_ret EPTPageTableMapped_ret_t;
34
35struct findEPTForASID_ret {
36    exception_t status;
37    ept_pml4e_t *ept;
38};
39typedef struct findEPTForASID_ret findEPTForASID_ret_t;
40
41EPTPDPTMapped_ret_t EPTPDPTMapped(asid_t asid, vptr_t vptr, ept_pdpte_t *pdpt);
42EPTPageDirectoryMapped_ret_t EPTPageDirectoryMapped(asid_t asid, vptr_t vaddr, ept_pde_t *pd);
43EPTPageTableMapped_ret_t EPTPageTableMapped(asid_t asid, vptr_t vaddr, ept_pte_t *pt);
44findEPTForASID_ret_t findEPTForASID(asid_t asid);
45
46void deleteEPTASID(asid_t asid, ept_pml4e_t *ept);
47exception_t decodeX86EPTInvocation(word_t invLabel, word_t length, cptr_t cptr, cte_t *cte, cap_t cap,
48                                   extra_caps_t excaps, word_t *buffer);
49exception_t decodeX86EPTPDInvocation(word_t invLabel, word_t length, cte_t *cte, cap_t cap, extra_caps_t excaps,
50                                     word_t *buffer);
51exception_t decodeX86EPTPTInvocation(word_t invLabel, word_t length, cte_t *cte, cap_t cap, extra_caps_t excaps,
52                                     word_t *buffer);
53exception_t decodeX86EPTPageMap(word_t invLabel, word_t length, cte_t *cte, cap_t cap, extra_caps_t excaps,
54                                word_t *buffer);
55exception_t performX86EPTPageInvocationUnmap(cap_t cap, cte_t *ctSlot);
56void unmapEPTPDPT(asid_t asid, vptr_t vaddr, ept_pdpte_t *pdpt);
57void unmapEPTPageDirectory(asid_t asid, vptr_t vaddr, ept_pde_t *pd);
58void unmapEPTPageTable(asid_t asid, vptr_t vaddr, ept_pte_t *pt);
59void unmapEPTPage(vm_page_size_t page_size, asid_t asid, vptr_t vptr, void *pptr);
60
61#endif /* CONFIG_VTX */
62
63