1/* @title: VMM Mapping Macros */
2#pragma once
3#include <compiler.h>
4
5/* Domain-first overloads for the page mapping API.
6 *
7 * Each "domain" whose signature genuinely differs (kernel, user, demand, ...)
8 * is its own first-class _internal function. The two trailing knobs, by
9 * contrast, are defaulted: vmm_flags defaults to VMM_FLAG_NONE and page size
10 * to 4KB, so the common case stays terse and a caller appends one or both only
11 * when it needs to (mirroring alloc_api_internal.h's flags/behavior tail). The
12 * order is (..., vflags, size): supply vflags to reach size. */
13
14/* vmm_map_page(virt, phys, flags[, vflags[, size]]) */
15#define vmm_map_page_3(v, p, f) \
16 vmm_map_page_internal((v), (p), (f), VMM_FLAG_NONE, VMM_MAP_PAGE_SIZE_4KB)
17#define vmm_map_page_4(v, p, f, vf) \
18 vmm_map_page_internal((v), (p), (f), (vf), VMM_MAP_PAGE_SIZE_4KB)
19#define vmm_map_page_5(v, p, f, vf, sz) \
20 vmm_map_page_internal((v), (p), (f), (vf), (sz))
21#define vmm_map_page(...) \
22 _DISPATCH(vmm_map_page, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
23
24/* vmm_map_page_user(pml4, virt, phys, flags[, vflags[, size]]) */
25#define vmm_map_page_user_4(pml4, v, p, f) \
26 vmm_map_page_user_internal((pml4), (v), (p), (f), VMM_FLAG_NONE, \
27 VMM_MAP_PAGE_SIZE_4KB)
28#define vmm_map_page_user_5(pml4, v, p, f, vf) \
29 vmm_map_page_user_internal((pml4), (v), (p), (f), (vf), \
30 VMM_MAP_PAGE_SIZE_4KB)
31#define vmm_map_page_user_6(pml4, v, p, f, vf, sz) \
32 vmm_map_page_user_internal((pml4), (v), (p), (f), (vf), (sz))
33#define vmm_map_page_user(...) \
34 _DISPATCH(vmm_map_page_user, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
35
36/* vmm_unmap_page(virt[, vflags[, size]]) */
37#define vmm_unmap_page_1(v) \
38 vmm_unmap_page_internal((v), VMM_FLAG_NONE, VMM_MAP_PAGE_SIZE_4KB)
39#define vmm_unmap_page_2(v, vf) \
40 vmm_unmap_page_internal((v), (vf), VMM_MAP_PAGE_SIZE_4KB)
41#define vmm_unmap_page_3(v, vf, sz) vmm_unmap_page_internal((v), (vf), (sz))
42#define vmm_unmap_page(...) \
43 _DISPATCH(vmm_unmap_page, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
44
45/* vmm_get_phys(virt[, vflags]) - vflags defaults to VMM_FLAG_NONE */
46#define vmm_get_phys_1(v) vmm_get_phys_internal((v), VMM_FLAG_NONE)
47#define vmm_get_phys_2(v, vf) vmm_get_phys_internal((v), (vf))
48#define vmm_get_phys(...) \
49 _DISPATCH(vmm_get_phys, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
50
51/* vmm_get_leaf_pte(virt[, vflags]) - vflags defaults to VMM_FLAG_NONE */
52#define vmm_get_leaf_pte_1(v) vmm_get_leaf_pte_internal((v), VMM_FLAG_NONE)
53#define vmm_get_leaf_pte_2(v, vf) vmm_get_leaf_pte_internal((v), (vf))
54#define vmm_get_leaf_pte(...) \
55 _DISPATCH(vmm_get_leaf_pte, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
56
57/* vmm_map_bump(addr, len, flags[, vflags]) */
58#define vmm_map_bump_3(a, l, f) \
59 vmm_map_bump_internal((a), (l), (f), VMM_FLAG_NONE)
60#define vmm_map_bump_4(a, l, f, vf) vmm_map_bump_internal((a), (l), (f), (vf))
61#define vmm_map_bump(...) \
62 _DISPATCH(vmm_map_bump, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
63
64/* vmm_mark_demand_page(virt, flags[, size]) */
65#define vmm_mark_demand_page_2(v, f) \
66 vmm_mark_demand_page_internal((v), (f), VMM_MAP_PAGE_SIZE_4KB)
67#define vmm_mark_demand_page_3(v, f, sz) \
68 vmm_mark_demand_page_internal((v), (f), (sz))
69#define vmm_mark_demand_page(...) \
70 _DISPATCH(vmm_mark_demand_page, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
71
72/* vmm_mark_demand_page_user(pml4, virt, flags[, size]) */
73#define vmm_mark_demand_page_user_3(pml4, v, f) \
74 vmm_mark_demand_page_user_internal((pml4), (v), (f), VMM_MAP_PAGE_SIZE_4KB)
75#define vmm_mark_demand_page_user_4(pml4, v, f, sz) \
76 vmm_mark_demand_page_user_internal((pml4), (v), (f), (sz))
77#define vmm_mark_demand_page_user(...) \
78 _DISPATCH(vmm_mark_demand_page_user, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
79
80/* vmm_map_demand_page(virt, phys, flags[, size]) */
81#define vmm_map_demand_page_3(v, p, f) \
82 vmm_map_demand_page_internal((v), (p), (f), VMM_MAP_PAGE_SIZE_4KB)
83#define vmm_map_demand_page_4(v, p, f, sz) \
84 vmm_map_demand_page_internal((v), (p), (f), (sz))
85#define vmm_map_demand_page(...) \
86 _DISPATCH(vmm_map_demand_page, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
87