| 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 | |