7#ifndef ZEPHYR_INCLUDE_SYS_MEM_MANAGE_H
8#define ZEPHYR_INCLUDE_SYS_MEM_MANAGE_H
12#if defined(CONFIG_ARM_MMU) && defined(CONFIG_ARM64)
29#define K_MEM_CACHE_NONE 2
32#define K_MEM_CACHE_WT 1
35#define K_MEM_CACHE_WB 0
43#define K_MEM_CACHE_MASK (BIT(3) - 1)
50#define K_MEM_PERM_RW BIT(3)
53#define K_MEM_PERM_EXEC BIT(4)
56#define K_MEM_PERM_USER BIT(5)
63#define K_MEM_DIRECT_MAP BIT(6)
84#define Z_MEM_VM_OFFSET ((CONFIG_KERNEL_VM_BASE + CONFIG_KERNEL_VM_OFFSET) - \
85 (CONFIG_SRAM_BASE_ADDRESS + CONFIG_SRAM_OFFSET))
87#define Z_MEM_VM_OFFSET 0
90#define Z_MEM_PHYS_ADDR(virt) ((virt) - Z_MEM_VM_OFFSET)
91#define Z_MEM_VIRT_ADDR(phys) ((phys) + Z_MEM_VM_OFFSET)
93#if Z_MEM_VM_OFFSET != 0
96#error "XIP and a virtual memory kernel are not allowed"
107#ifdef CONFIG_DEMAND_PAGING_STATS
113 unsigned long irq_locked;
116 unsigned long irq_unlocked;
118#ifndef CONFIG_DEMAND_PAGING_ALLOW_IRQ
120 unsigned long in_isr;
135#ifdef CONFIG_DEMAND_PAGING_TIMING_HISTOGRAM
137 unsigned long counts[CONFIG_DEMAND_PAGING_TIMING_HISTOGRAM_NUM_BINS];
142 unsigned long bounds[CONFIG_DEMAND_PAGING_TIMING_HISTOGRAM_NUM_BINS];
147static inline uintptr_t z_mem_phys_addr(
void *virt)
153#
if CONFIG_KERNEL_VM_BASE != 0
154 (addr >= CONFIG_KERNEL_VM_BASE) &&
156 (addr < (CONFIG_KERNEL_VM_BASE +
157 (CONFIG_KERNEL_VM_SIZE))),
158 "address %p not in permanent mappings", virt);
162#
if CONFIG_SRAM_BASE_ADDRESS != 0
163 (addr >= CONFIG_SRAM_BASE_ADDRESS) &&
165 (addr < (CONFIG_SRAM_BASE_ADDRESS +
166 (CONFIG_SRAM_SIZE * 1024UL))),
167 "physical address 0x%lx not in RAM",
168 (
unsigned long)addr);
175 return Z_MEM_PHYS_ADDR(addr);
179static inline void *z_mem_virt_addr(
uintptr_t phys)
182#
if CONFIG_SRAM_BASE_ADDRESS != 0
183 (phys >= CONFIG_SRAM_BASE_ADDRESS) &&
185 (phys < (CONFIG_SRAM_BASE_ADDRESS +
186 (CONFIG_SRAM_SIZE * 1024UL))),
187 "physical address 0x%lx not in RAM", (
unsigned long)phys);
193 return (
void *)Z_MEM_VIRT_ADDR(phys);
271void z_phys_unmap(
uint8_t *virt,
size_t size);
286#define K_MEM_MAP_UNINIT BIT(16)
295#define K_MEM_MAP_LOCK BIT(17)
380 uintptr_t addr,
size_t size,
size_t align);
516#include <syscalls/mem_manage.h>
void k_mem_paging_backing_store_page_finalize(struct z_page_frame *pf, uintptr_t location)
Update internal accounting after a page-in.
void k_mem_paging_backing_store_page_out(uintptr_t location)
Copy a data page from Z_SCRATCH_PAGE to the specified location.
void k_mem_paging_backing_store_location_free(uintptr_t location)
Free a backing store location.
void k_mem_paging_backing_store_init(void)
Backing store initialization function.
void k_mem_paging_backing_store_page_in(uintptr_t location)
Copy a data page from the provided location to Z_SCRATCH_PAGE.
int k_mem_paging_backing_store_location_get(struct z_page_frame *pf, uintptr_t *location, bool page_fault)
Reserve or fetch a storage location for a data page loaded into a page frame.
struct z_page_frame * k_mem_paging_eviction_select(bool *dirty)
Select a page frame for eviction.
void k_mem_paging_eviction_init(void)
Initialization function.
int k_mem_page_out(void *addr, size_t size)
Evict a page-aligned virtual memory region to the backing store.
void k_mem_paging_histogram_backing_store_page_in_get(struct k_mem_paging_histogram_t *hist)
Get the backing store page-in timing histogram.
void k_mem_unpin(void *addr, size_t size)
Un-pin an aligned virtual data region.
void k_mem_paging_stats_get(struct k_mem_paging_stats_t *stats)
Get the paging statistics since system startup.
void k_mem_pin(void *addr, size_t size)
Pin an aligned virtual data region, paging in as necessary.
void k_mem_page_in(void *addr, size_t size)
Load a virtual data region into memory.
void k_mem_paging_histogram_backing_store_page_out_get(struct k_mem_paging_histogram_t *hist)
Get the backing store page-out timing histogram.
void k_mem_paging_histogram_eviction_get(struct k_mem_paging_histogram_t *hist)
Get the eviction timing histogram.
void k_mem_paging_thread_stats_get(struct k_thread *thread, struct k_mem_paging_stats_t *stats)
Get the paging statistics since system startup for a thread.
size_t k_mem_free_get(void)
Return the amount of free memory available.
size_t k_mem_region_align(uintptr_t *aligned_addr, size_t *aligned_size, uintptr_t addr, size_t size, size_t align)
Given an arbitrary region, provide a aligned region that covers it.
void k_mem_unmap(void *addr, size_t size)
Un-map mapped memory.
void * k_mem_map(size_t size, uint32_t flags)
Map anonymous memory into Zephyr's address space.
flags
Definition: parser.h:96
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINTPTR_TYPE__ uintptr_t
Definition: stdint.h:105
Definition: mem_manage.h:134
Definition: mem_manage.h:106
Thread Structure.
Definition: thread.h:250