MOS Source Code
Loading...
Searching...
No Matches
pml1.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
4
5#include "mos/assert.hpp"
8
9#include <algorithm>
10#include <mos_stdlib.hpp>
11
12#if MOS_PLATFORM_PAGING_LEVELS < 1
13#error "Give up your mind"
14#endif
15
16void pml1_traverse(pml1_t pml1, ptr_t *vaddr, size_t *n_pages, pagetable_walk_options_t callback, void *data)
17{
18 for (size_t pml1_i = pml1_index(*vaddr); pml1_i < PML1_ENTRIES && *n_pages; pml1_i++)
19 {
20 pml1e_t *pml1e = pml1_entry(pml1, *vaddr);
21 if (callback.pml1e_callback)
22 callback.pml1e_callback(pml1, pml1e, *vaddr, data);
23 (*vaddr) += std::min(*n_pages, (size_t) PML1E_NPAGES) * MOS_PAGE_SIZE;
24 (*n_pages) -= std::min(*n_pages, (size_t) PML1E_NPAGES);
25 }
26}
27
28bool pml1_destroy_range(pml1_t pml1, ptr_t *vaddr, size_t *n_pages)
29{
30 const bool should_zap_this_pml1 = pml1_index(*vaddr) == 0 && *n_pages >= PML1_ENTRIES * PML1E_NPAGES;
31
32 for (size_t pml1_i = pml1_index(*vaddr); pml1_i < PML1_ENTRIES && *n_pages; pml1_i++)
33 {
34 pml1e_t *pml1e = pml1_entry(pml1, *vaddr);
36
37 (*vaddr) += PML1E_NPAGES * MOS_PAGE_SIZE;
38 (*n_pages) -= PML1E_NPAGES;
39 }
40
41 if (should_zap_this_pml1)
43
44 return should_zap_this_pml1;
45}
46
48{
49 return &pml1.table[pml1_index(vaddr)];
50}
51
52bool pml1e_is_present(const pml1e_t *pml1e)
53{
54 return platform_pml1e_get_present(pml1e);
55}
56
58{
59 return platform_pml1e_get_pfn(pml1e);
60}
pfn_t platform_pml1e_get_pfn(const pml1e_t *pml1e)
Definition mm.cpp:78
bool platform_pml1e_get_present(const pml1e_t *pml1e)
Definition mm.cpp:90
#define MOS_ASSERT(cond)
Definition assert.hpp:14
#define MOS_PAGE_SIZE
Definition autoconf.h:6
bool callback(pb_istream_t *stream, uint8_t *buf, size_t count)
void pml1_traverse(pml1_t pml1, ptr_t *vaddr, size_t *n_pages, pagetable_walk_options_t callback, void *data)
Definition pml1.cpp:16
bool pml1_destroy_range(pml1_t pml1, ptr_t *vaddr, size_t *n_pages)
Definition pml1.cpp:28
pfn_t pml1e_get_pfn(const pml1e_t *pml1e)
Definition pml1.cpp:57
bool pml1e_is_present(const pml1e_t *pml1e)
Definition pml1.cpp:52
pml1e_t * pml1_entry(pml1_t pml1, ptr_t vaddr)
Definition pml1.cpp:47
#define pml_destroy_table(x)
#define pml1_index(vaddr)
Definition pml_types.hpp:37
#define PML1E_NPAGES
Definition pml_types.hpp:38
#define PML1_ENTRIES
pml1e_t * table
Definition pml_types.hpp:35
unsigned long long pfn_t
Definition types.h:37
unsigned long ptr_t
Definition types.h:21