Zephyr Project API  3.1.0
A Scalable Open Source RTOS
mem_manage.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_SYS_MEM_MANAGE_H
8#define ZEPHYR_INCLUDE_SYS_MEM_MANAGE_H
9
10#include <zephyr/sys/util.h>
11#include <zephyr/toolchain.h>
12#if defined(CONFIG_ARM_MMU) && defined(CONFIG_ARM64)
14#endif
15
16/*
17 * Caching mode definitions. These are mutually exclusive.
18 */
19
21#define K_MEM_CACHE_NONE 2
22
24#define K_MEM_CACHE_WT 1
25
27#define K_MEM_CACHE_WB 0
28
29/*
30 * ARM64 Specific flags are defined in arch/arm64/arm_mem.h,
31 * pay attention to be not conflicted when updating these flags.
32 */
33
35#define K_MEM_CACHE_MASK (BIT(3) - 1)
36
37/*
38 * Region permission attributes. Default is read-only, no user, no exec
39 */
40
42#define K_MEM_PERM_RW BIT(3)
43
45#define K_MEM_PERM_EXEC BIT(4)
46
48#define K_MEM_PERM_USER BIT(5)
49
50/*
51 * This is the offset to subtract from a virtual address mapped in the
52 * kernel's permanent mapping of RAM, to obtain its physical address.
53 *
54 * virt_addr = phys_addr + Z_MEM_VM_OFFSET
55 *
56 * This only works for virtual addresses within the interval
57 * [CONFIG_KERNEL_VM_BASE, CONFIG_KERNEL_VM_BASE + (CONFIG_SRAM_SIZE * 1024)).
58 *
59 * These macros are intended for assembly, linker code, and static initializers.
60 * Use with care.
61 *
62 * Note that when demand paging is active, these will only work with page
63 * frames that are pinned to their virtual mapping at boot.
64 *
65 * TODO: This will likely need to move to an arch API or need additional
66 * constraints defined.
67 */
68#ifdef CONFIG_MMU
69#define Z_MEM_VM_OFFSET ((CONFIG_KERNEL_VM_BASE + CONFIG_KERNEL_VM_OFFSET) - \
70 (CONFIG_SRAM_BASE_ADDRESS + CONFIG_SRAM_OFFSET))
71#else
72#define Z_MEM_VM_OFFSET 0
73#endif
74
75#define Z_MEM_PHYS_ADDR(virt) ((virt) - Z_MEM_VM_OFFSET)
76#define Z_MEM_VIRT_ADDR(phys) ((phys) + Z_MEM_VM_OFFSET)
77
78#if Z_MEM_VM_OFFSET != 0
79#define Z_VM_KERNEL 1
80#ifdef CONFIG_XIP
81#error "XIP and a virtual memory kernel are not allowed"
82#endif
83#endif
84
85#ifndef _ASMLANGUAGE
86#include <stdint.h>
87#include <stddef.h>
88#include <inttypes.h>
89#include <zephyr/sys/__assert.h>
90
92#ifdef CONFIG_DEMAND_PAGING_STATS
93 struct {
95 unsigned long cnt;
96
98 unsigned long irq_locked;
99
101 unsigned long irq_unlocked;
102
103#ifndef CONFIG_DEMAND_PAGING_ALLOW_IRQ
105 unsigned long in_isr;
106#endif
107 } pagefaults;
108
109 struct {
111 unsigned long clean;
112
114 unsigned long dirty;
115 } eviction;
116#endif /* CONFIG_DEMAND_PAGING_STATS */
117};
118
120#ifdef CONFIG_DEMAND_PAGING_TIMING_HISTOGRAM
121 /* Counts for each bin in timing histogram */
122 unsigned long counts[CONFIG_DEMAND_PAGING_TIMING_HISTOGRAM_NUM_BINS];
123
124 /* Bounds for the bins in timing histogram,
125 * excluding the first and last (hence, NUM_SLOTS - 1).
126 */
127 unsigned long bounds[CONFIG_DEMAND_PAGING_TIMING_HISTOGRAM_NUM_BINS];
128#endif /* CONFIG_DEMAND_PAGING_TIMING_HISTOGRAM */
129};
130
131/* Just like Z_MEM_PHYS_ADDR() but with type safety and assertions */
132static inline uintptr_t z_mem_phys_addr(void *virt)
133{
134 uintptr_t addr = (uintptr_t)virt;
135
136#ifdef CONFIG_MMU
137 __ASSERT((addr >= CONFIG_KERNEL_VM_BASE) &&
138 (addr < (CONFIG_KERNEL_VM_BASE +
139 (CONFIG_KERNEL_VM_SIZE))),
140 "address %p not in permanent mappings", virt);
141#else
142 /* Should be identity-mapped */
143 __ASSERT((addr >= CONFIG_SRAM_BASE_ADDRESS) &&
144 (addr < (CONFIG_SRAM_BASE_ADDRESS +
145 (CONFIG_SRAM_SIZE * 1024UL))),
146 "physical address 0x%lx not in RAM",
147 (unsigned long)addr);
148#endif /* CONFIG_MMU */
149
150 /* TODO add assertion that this page is pinned to boot mapping,
151 * the above checks won't be sufficient with demand paging
152 */
153
154 return Z_MEM_PHYS_ADDR(addr);
155}
156
157/* Just like Z_MEM_VIRT_ADDR() but with type safety and assertions */
158static inline void *z_mem_virt_addr(uintptr_t phys)
159{
160 __ASSERT((phys >= CONFIG_SRAM_BASE_ADDRESS) &&
161 (phys < (CONFIG_SRAM_BASE_ADDRESS +
162 (CONFIG_SRAM_SIZE * 1024UL))),
163 "physical address 0x%lx not in RAM", (unsigned long)phys);
164
165 /* TODO add assertion that this page frame is pinned to boot mapping,
166 * the above check won't be sufficient with demand paging
167 */
168
169 return (void *)Z_MEM_VIRT_ADDR(phys);
170}
171
172#ifdef __cplusplus
173extern "C" {
174#endif
175
217void z_phys_map(uint8_t **virt_ptr, uintptr_t phys, size_t size,
219
247void z_phys_unmap(uint8_t *virt, size_t size);
248
249/*
250 * k_mem_map() control flags
251 */
252
264#define K_MEM_MAP_UNINIT BIT(16)
265
275#define K_MEM_MAP_LOCK BIT(17)
276
294#define K_MEM_MAP_GUARD __DEPRECATED_MACRO BIT(18)
295
307size_t k_mem_free_get(void);
308
348void *k_mem_map(size_t size, uint32_t flags);
349
363void k_mem_unmap(void *addr, size_t size);
364
378size_t k_mem_region_align(uintptr_t *aligned_addr, size_t *aligned_size,
379 uintptr_t addr, size_t size, size_t align);
380
409int k_mem_page_out(void *addr, size_t size);
410
424void k_mem_page_in(void *addr, size_t size);
425
439void k_mem_pin(void *addr, size_t size);
440
451void k_mem_unpin(void *addr, size_t size);
452
461__syscall void k_mem_paging_stats_get(struct k_mem_paging_stats_t *stats);
462
463struct k_thread;
473__syscall
475 struct k_mem_paging_stats_t *stats);
476
486 struct k_mem_paging_histogram_t *hist);
487
497 struct k_mem_paging_histogram_t *hist);
498
508 struct k_mem_paging_histogram_t *hist);
509
510#include <syscalls/mem_manage.h>
511
535struct z_page_frame *k_mem_paging_eviction_select(bool *dirty);
536
545
590int k_mem_paging_backing_store_location_get(struct z_page_frame *pf,
591 uintptr_t *location,
592 bool page_fault);
593
605
618
631
652void k_mem_paging_backing_store_page_finalize(struct z_page_frame *pf,
653 uintptr_t location);
654
669
672#ifdef __cplusplus
673}
674#endif
675
676#endif /* !_ASMLANGUAGE */
677#endif /* ZEPHYR_INCLUDE_SYS_MEM_MANAGE_H */
static struct k_thread thread[2]
Definition: atomic.c:26
void k_mem_paging_backing_store_page_finalize(struct z_page_frame *pf, uintptr_t location)
void k_mem_paging_backing_store_page_out(uintptr_t location)
void k_mem_paging_backing_store_location_free(uintptr_t location)
void k_mem_paging_backing_store_init(void)
void k_mem_paging_backing_store_page_in(uintptr_t location)
int k_mem_paging_backing_store_location_get(struct z_page_frame *pf, uintptr_t *location, bool page_fault)
struct z_page_frame * k_mem_paging_eviction_select(bool *dirty)
void k_mem_paging_eviction_init(void)
int k_mem_page_out(void *addr, size_t size)
void k_mem_paging_histogram_backing_store_page_in_get(struct k_mem_paging_histogram_t *hist)
void k_mem_unpin(void *addr, size_t size)
void k_mem_paging_stats_get(struct k_mem_paging_stats_t *stats)
void k_mem_pin(void *addr, size_t size)
void k_mem_page_in(void *addr, size_t size)
void k_mem_paging_histogram_backing_store_page_out_get(struct k_mem_paging_histogram_t *hist)
void k_mem_paging_histogram_eviction_get(struct k_mem_paging_histogram_t *hist)
void k_mem_paging_thread_stats_get(struct k_thread *thread, struct k_mem_paging_stats_t *stats)
flags
Definition: http_parser.h:131
size_t k_mem_free_get(void)
size_t k_mem_region_align(uintptr_t *aligned_addr, size_t *aligned_size, uintptr_t addr, size_t size, size_t align)
void k_mem_unmap(void *addr, size_t size)
void * k_mem_map(size_t size, uint32_t flags)
__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:119
Definition: mem_manage.h:91
Definition: thread.h:231
Macros to abstract toolchain specific capabilities.
Misc utilities.