MOS Source Code
Loading...
Searching...
No Matches
mm.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#pragma once
4
5#include "mos/io/io.hpp"
6#include "mos/mm/mmstat.hpp"
10
11#include <mos/allocator.hpp>
14#include <mos/mm/mm_types.h>
15
21
22typedef enum
23{
25 VMAP_STACK, // stack (user)
26 VMAP_FILE, // file mapping
27 VMAP_MMAP, // mmap mapping
28 VMAP_DMA, // DMA mapping
30
31typedef enum
32{
33 VMAP_TYPE_PRIVATE = MMAP_PRIVATE, // there will be distinct copies of the memory region in the child process
34 VMAP_TYPE_SHARED = MMAP_SHARED, // the memory region will be shared between the parent and child processes
36
45
54
55struct vmap_t;
56
57typedef vmfault_result_t (*vmfault_handler_t)(vmap_t *vmap, ptr_t fault_addr, pagefault_t *info);
58
59struct vmap_t : mos::NamedType<"VMap">
60{
63
64 ptr_t vaddr; // virtual addresses
65 size_t npages;
66 VMFlags vmflags; // the expected flags for the region, regardless of the copy-on-write state
68
69 IO *io; // the io object that (possibly) backs this vmap
70 off_t io_offset; // the offset in the io object, page-aligned
71
76
78 {
79 return stream << fmt("\\{ [{} - {}] }", (void *) vmap->vaddr, (void *) (vmap->vaddr + vmap->npages * MOS_PAGE_SIZE - 1));
80 }
81};
82
83#define pfn_va(pfn) ((ptr_t) (platform_info->direct_map_base + (pfn) * (MOS_PAGE_SIZE)))
84#define va_pfn(va) ((((ptr_t) (va)) - platform_info->direct_map_base) / MOS_PAGE_SIZE)
85#define va_phyframe(va) (&phyframes[va_pfn(va)])
86#define phyframe_va(frame) ((ptr_t) pfn_va(phyframe_pfn(frame)))
87#define pa_va(pa) ((ptr_t) (pa) + platform_info->direct_map_base)
88
91phyframe_t *mm_get_free_pages(size_t npages);
92
93#define mm_free_page(frame) pmm_free_frames(frame, 1)
94#define mm_free_pages(frame, npages) pmm_free_frames(frame, npages)
95
102
108void mm_destroy_context(MMContext *table);
109
116void mm_lock_context_pair(MMContext *ctx1, MMContext *ctx2 = nullptr);
117void mm_unlock_context_pair(MMContext *ctx1, MMContext *ctx2 = nullptr);
118
120
129vmap_t *vmap_create(MMContext *mmctx, ptr_t vaddr, size_t npages);
130
137void vmap_destroy(vmap_t *vmap);
138
147vmap_t *vmap_obtain(MMContext *mmctx, ptr_t vaddr, size_t *out_offset = nullptr);
148
156vmap_t *vmap_split(vmap_t *vmap, size_t split);
157
166vmap_t *vmap_split_for_range(vmap_t *vmap, size_t rstart_pgoff, size_t rend_pgoff);
167
176void vmap_finalise_init(vmap_t *vmap, vmap_content_t content, vmap_type_t type);
177
186[[nodiscard("resolve completed")]] vmfault_result_t mm_resolve_cow_fault(vmap_t *vmap, ptr_t fault_addr, pagefault_t *info);
187
194void mm_handle_fault(ptr_t fault_addr, pagefault_t *info);
195
#define MOS_PAGE_SIZE
Definition autoconf.h:6
__nodiscard MMContext * mm_switch_context(MMContext *new_ctx)
Definition mm.cpp:124
void vmap_finalise_init(vmap_t *vmap, vmap_content_t content, vmap_type_t type)
Finalize the initialization of a vmap object.
Definition mm.cpp:254
vmfault_result_t
Definition mm.hpp:47
vmap_type_t
Definition mm.hpp:32
phyframe_t * mm_get_free_page(void)
Definition mm.cpp:38
vmap_t * vmap_obtain(MMContext *mmctx, ptr_t vaddr, size_t *out_offset=nullptr)
Get the vmap object for a virtual address.
Definition mm.cpp:189
phyframe_t * mm_get_free_page_raw(void)
Definition mm.cpp:26
vmap_t * vmap_split(vmap_t *vmap, size_t split)
Split a vmap object into two, at the specified offset.
Definition mm.cpp:209
void mm_lock_context_pair(MMContext *ctx1, MMContext *ctx2=nullptr)
Lock and unlock a pair of MMContext objects.
Definition mm.cpp:87
void mm_destroy_context(MMContext *table)
Destroy a user-mode platform-dependent page table.
Definition mm.cpp:75
vmfault_result_t mm_resolve_cow_fault(vmap_t *vmap, ptr_t fault_addr, pagefault_t *info)
Helper function to resolve a copy-on-write fault.
Definition mm.cpp:270
vmfault_result_t(* vmfault_handler_t)(vmap_t *vmap, ptr_t fault_addr, pagefault_t *info)
Definition mm.hpp:57
MMContext * mm_create_context(void)
Create a user-mode platform-dependent page table.
Definition mm.cpp:59
void mm_handle_fault(ptr_t fault_addr, pagefault_t *info)
Handle a page fault.
Definition mm.cpp:359
phyframe_t * mm_get_free_pages(size_t npages)
Definition mm.cpp:47
void mm_unlock_context_pair(MMContext *ctx1, MMContext *ctx2=nullptr)
Definition mm.cpp:105
vmap_t * vmap_create(MMContext *mmctx, ptr_t vaddr, size_t npages)
Create a vmap object and insert it into the address space.
Definition mm.cpp:156
void vmap_destroy(vmap_t *vmap)
Destroy a vmap object, and unmmap the region.
Definition mm.cpp:168
vmap_content_t
Definition mm.hpp:23
vmap_t * vmap_split_for_range(vmap_t *vmap, size_t rstart_pgoff, size_t rend_pgoff)
Split a vmap to get a vmap object for a range of pages.
Definition mm.cpp:231
@ VMFAULT_COPY_BACKING_PAGE
the caller should copy the backing page into the faulting address
Definition mm.hpp:51
@ VMFAULT_MAP_BACKING_PAGE
the caller should map the backing page into the faulting address
Definition mm.hpp:50
@ VMFAULT_COMPLETE
no further action is needed, the page is correctly mapped now
Definition mm.hpp:48
@ VMFAULT_CANNOT_HANDLE
the handler cannot handle this fault
Definition mm.hpp:52
@ VMFAULT_MAP_BACKING_PAGE_RO
the caller should map the backing page into the faulting address, and mark it non-writable
Definition mm.hpp:49
@ VMAP_TYPE_PRIVATE
Definition mm.hpp:33
@ VMAP_TYPE_SHARED
Definition mm.hpp:34
@ VMAP_MMAP
Definition mm.hpp:27
@ VMAP_DMA
Definition mm.hpp:28
@ VMAP_UNKNOWN
Definition mm.hpp:24
@ VMAP_FILE
Definition mm.hpp:26
@ VMAP_STACK
Definition mm.hpp:25
@ MMAP_PRIVATE
Definition mm_types.h:17
@ MMAP_SHARED
Definition mm_types.h:18
#define __nodiscard
Definition mos_global.h:35
Definition io.hpp:39
bool is_exec
Definition mm.hpp:39
ptr_t ip
the instruction pointer which caused the fault
Definition mm.hpp:40
bool is_present
Definition mm.hpp:39
phyframe_t * faulting_page
the frame that contains the copy-on-write data (if any)
Definition mm.hpp:42
bool is_user
Definition mm.hpp:39
const phyframe_t * backing_page
the frame that contains the data for this page, the on_fault handler should set this
Definition mm.hpp:43
const platform_regs_t * regs
the registers of the moment that caused the fault
Definition mm.hpp:41
bool is_write
Definition mm.hpp:39
Memory usage statistics for a specific vmap area.
Definition mmstat.hpp:64
Definition mm.hpp:60
friend mos::SyslogStreamWriter operator<<(mos::SyslogStreamWriter stream, const vmap_t *vmap)
Definition mm.hpp:77
vmap_content_t content
Definition mm.hpp:72
ptr_t vaddr
Definition mm.hpp:64
VMFlags vmflags
Definition mm.hpp:66
size_t npages
Definition mm.hpp:65
vmfault_handler_t on_fault
Definition mm.hpp:75
as_linked_list
Definition mm.hpp:61
IO * io
Definition mm.hpp:69
vmap_stat_t stat
Definition mm.hpp:74
spinlock_t lock
Definition mm.hpp:62
MMContext * mmctx
Definition mm.hpp:67
off_t io_offset
Definition mm.hpp:70
vmap_type_t type
Definition mm.hpp:73
#define fmt(_fmt,...)
Definition syslog.hpp:161
ssize_t off_t
Definition types.h:80
unsigned long ptr_t
Definition types.h:21