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"
9
10#include <mos/allocator.hpp>
13#include <mos/mm/mm_types.h>
14
20
21typedef enum
22{
24 VMAP_STACK, // stack (user)
25 VMAP_FILE, // file mapping
26 VMAP_MMAP, // mmap mapping
27 VMAP_DMA, // DMA mapping
29
30typedef enum
31{
32 VMAP_TYPE_PRIVATE = MMAP_PRIVATE, // there will be distinct copies of the memory region in the child process
33 VMAP_TYPE_SHARED = MMAP_SHARED, // the memory region will be shared between the parent and child processes
35
44
53
54struct vmap_t;
55
56typedef vmfault_result_t (*vmfault_handler_t)(vmap_t *vmap, ptr_t fault_addr, pagefault_t *info);
57
58struct vmap_t : mos::NamedType<"VMap">
59{
62
63 ptr_t vaddr; // virtual addresses
64 size_t npages;
65 vm_flags vmflags; // the expected flags for the region, regardless of the copy-on-write state
67
68 io_t *io; // the io object that (possibly) backs this vmap
69 off_t io_offset; // the offset in the io object, page-aligned
70
75};
76
77#define pfn_va(pfn) ((ptr_t) (platform_info->direct_map_base + (pfn) * (MOS_PAGE_SIZE)))
78#define va_pfn(va) ((((ptr_t) (va)) - platform_info->direct_map_base) / MOS_PAGE_SIZE)
79#define va_phyframe(va) (&phyframes[va_pfn(va)])
80#define phyframe_va(frame) ((ptr_t) pfn_va(phyframe_pfn(frame)))
81#define pa_va(pa) ((ptr_t) (pa) + platform_info->direct_map_base)
82
85phyframe_t *mm_get_free_pages(size_t npages);
86
87#define mm_free_page(frame) pmm_free_frames(frame, 1)
88#define mm_free_pages(frame, npages) pmm_free_frames(frame, npages)
89
96
102void mm_destroy_context(MMContext *table);
103
110void mm_lock_ctx_pair(MMContext *ctx1, MMContext *ctx2);
111void mm_unlock_ctx_pair(MMContext *ctx1, MMContext *ctx2);
112
114
123vmap_t *vmap_create(MMContext *mmctx, ptr_t vaddr, size_t npages);
124
131void vmap_destroy(vmap_t *vmap);
132
141vmap_t *vmap_obtain(MMContext *mmctx, ptr_t vaddr, size_t *out_offset);
142
150vmap_t *vmap_split(vmap_t *vmap, size_t split);
151
160vmap_t *vmap_split_for_range(vmap_t *vmap, size_t rstart_pgoff, size_t rend_pgoff);
161
170void vmap_finalise_init(vmap_t *vmap, vmap_content_t content, vmap_type_t type);
171
180[[nodiscard("resolve completed")]] vmfault_result_t mm_resolve_cow_fault(vmap_t *vmap, ptr_t fault_addr, pagefault_t *info);
181
188void mm_handle_fault(ptr_t fault_addr, pagefault_t *info);
189
__nodiscard MMContext * mm_switch_context(MMContext *new_ctx)
Definition mm.cpp:120
void mm_lock_ctx_pair(MMContext *ctx1, MMContext *ctx2)
Lock and unlock a pair of MMContext objects.
Definition mm.cpp:88
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:250
vmfault_result_t
Definition mm.hpp:46
vmap_type_t
Definition mm.hpp:31
phyframe_t * mm_get_free_page(void)
Definition mm.cpp:39
vmap_t * vmap_obtain(MMContext *mmctx, ptr_t vaddr, size_t *out_offset)
Get the vmap object for a virtual address.
Definition mm.cpp:185
phyframe_t * mm_get_free_page_raw(void)
Definition mm.cpp:27
vmap_t * vmap_split(vmap_t *vmap, size_t split)
Split a vmap object into two, at the specified offset.
Definition mm.cpp:205
void mm_destroy_context(MMContext *table)
Destroy a user-mode platform-dependent page table.
Definition mm.cpp:76
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:266
void mm_unlock_ctx_pair(MMContext *ctx1, MMContext *ctx2)
Definition mm.cpp:104
vmfault_result_t(* vmfault_handler_t)(vmap_t *vmap, ptr_t fault_addr, pagefault_t *info)
Definition mm.hpp:56
MMContext * mm_create_context(void)
Create a user-mode platform-dependent page table.
Definition mm.cpp:60
void mm_handle_fault(ptr_t fault_addr, pagefault_t *info)
Handle a page fault.
Definition mm.cpp:358
phyframe_t * mm_get_free_pages(size_t npages)
Definition mm.cpp:48
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:152
void vmap_destroy(vmap_t *vmap)
Destroy a vmap object, and unmmap the region.
Definition mm.cpp:164
vmap_content_t
Definition mm.hpp:22
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:227
@ VMFAULT_COPY_BACKING_PAGE
the caller should copy the backing page into the faulting address
Definition mm.hpp:50
@ VMFAULT_MAP_BACKING_PAGE
the caller should map the backing page into the faulting address
Definition mm.hpp:49
@ VMFAULT_COMPLETE
no further action is needed, the page is correctly mapped now
Definition mm.hpp:47
@ VMFAULT_CANNOT_HANDLE
the handler cannot handle this fault
Definition mm.hpp:51
@ VMFAULT_MAP_BACKING_PAGE_RO
the caller should map the backing page into the faulting address, and mark it non-writable
Definition mm.hpp:48
@ VMAP_TYPE_PRIVATE
Definition mm.hpp:32
@ VMAP_TYPE_SHARED
Definition mm.hpp:33
@ VMAP_MMAP
Definition mm.hpp:26
@ VMAP_DMA
Definition mm.hpp:27
@ VMAP_UNKNOWN
Definition mm.hpp:23
@ VMAP_FILE
Definition mm.hpp:25
@ VMAP_STACK
Definition mm.hpp:24
@ MMAP_PRIVATE
Definition mm_types.h:17
@ MMAP_SHARED
Definition mm_types.h:18
#define __nodiscard
Definition mos_global.h:35
vm_flags
Definition platform.hpp:42
Definition io.hpp:48
bool is_exec
Definition mm.hpp:38
ptr_t ip
the instruction pointer which caused the fault
Definition mm.hpp:39
bool is_present
Definition mm.hpp:38
platform_regs_t * regs
the registers of the moment that caused the fault
Definition mm.hpp:40
phyframe_t * faulting_page
the frame that contains the copy-on-write data (if any)
Definition mm.hpp:41
bool is_user
Definition mm.hpp:38
const phyframe_t * backing_page
the frame that contains the data for this page, the on_fault handler should set this
Definition mm.hpp:42
bool is_write
Definition mm.hpp:38
Memory usage statistics for a specific vmap area.
Definition mmstat.hpp:64
Definition mm.hpp:59
vmap_content_t content
Definition mm.hpp:71
ptr_t vaddr
Definition mm.hpp:63
size_t npages
Definition mm.hpp:64
vmfault_handler_t on_fault
Definition mm.hpp:74
as_linked_list
Definition mm.hpp:60
vm_flags vmflags
Definition mm.hpp:65
vmap_stat_t stat
Definition mm.hpp:73
spinlock_t lock
Definition mm.hpp:61
io_t * io
Definition mm.hpp:68
MMContext * mmctx
Definition mm.hpp:66
off_t io_offset
Definition mm.hpp:69
vmap_type_t type
Definition mm.hpp:72
ssize_t off_t
Definition types.h:80
unsigned long ptr_t
Definition types.h:21