1/* @title: VMM Mapping Macros */
2#pragma once
3#include <compiler/diagnostic.h>
4
5/* Every API is (positional operands..., .designated = overrides...) */
6#define vmm_request_with_defaults(...) \
7 cc_wno_override_init_expr( \
8 struct vmm_request, \
9 ((struct vmm_request) {.page_flags = PAGE_NO_FLAGS, \
10 .vmm_flags = VMM_FLAG_NONE, \
11 .page_size = VMM_MAP_PAGE_SIZE_4KB, \
12 .tlb_mode = TLB_MODE_SYNC, \
13 ##__VA_ARGS__}))
14
15/* vmm_map_page(virt, phys[, .page_flags, .vmm_flags, .page_size, .tlb_mode]) */
16#define vmm_map_page(v, p, ...) \
17 vmm_map_page_full((v), (p), vmm_request_with_defaults(__VA_ARGS__))
18
19#define vmm_map_page_user(pml4, v, p, ...) \
20 vmm_map_page_user_full((pml4), (v), (p), \
21 vmm_request_with_defaults(__VA_ARGS__))
22
23#define vmm_unmap_page(v, ...) \
24 vmm_unmap_page_full((v), vmm_request_with_defaults(__VA_ARGS__))
25
26#define vmm_get_phys(v, ...) \
27 vmm_get_phys_full((v), vmm_request_with_defaults(__VA_ARGS__))
28
29#define vmm_get_leaf_pte(v, ...) \
30 vmm_get_leaf_pte_full((v), vmm_request_with_defaults(__VA_ARGS__))
31
32/* Multi-page helpers: .page_flags are OR'd onto PRESENT | WRITE */
33#define vmm_map(paddr, vaddr, len, ...) \
34 vmm_map_full((paddr), (vaddr), (len), \
35 vmm_request_with_defaults(__VA_ARGS__))
36
37#define vmm_unmap(addr, len, ...) \
38 vmm_unmap_full((addr), (len), vmm_request_with_defaults(__VA_ARGS__))
39
40#define vmm_map_bump(addr, len, ...) \
41 vmm_map_bump_full((addr), (len), vmm_request_with_defaults(__VA_ARGS__))
42
43#define vmm_unmap_all_user_pages(pml4, ...) \
44 vmm_unmap_all_user_pages_full((pml4), \
45 vmm_request_with_defaults(__VA_ARGS__))
46
47#define vmm_map_aliased(v, len, p, ...) \
48 vmm_map_aliased_full((v), (len), (p), \
49 vmm_request_with_defaults(__VA_ARGS__))
50
51/* leaf size to unshare down to is .page_size */
52#define vmm_unshare_path(v, ...) \
53 vmm_unshare_path_full((v), vmm_request_with_defaults(__VA_ARGS__))
54
55/* Demand pages take demand_page_flags positionally */
56#define vmm_mark_demand_page(v, dflags, ...) \
57 vmm_mark_demand_page_full((v), (dflags), \
58 vmm_request_with_defaults(__VA_ARGS__))
59
60#define vmm_mark_demand_page_user(pml4, v, dflags, ...) \
61 vmm_mark_demand_page_user_full((pml4), (v), (dflags), \
62 vmm_request_with_defaults(__VA_ARGS__))
63
64#define vmm_map_demand_page(v, p, dflags, ...) \
65 vmm_map_demand_page_full((v), (p), (dflags), \
66 vmm_request_with_defaults(__VA_ARGS__))
67