mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-09-21 10:36:04 +08:00
[fixup] add cache maintenance ops;
fix bugs on cache maintenance when starting user app
This commit is contained in:
@@ -8,8 +8,14 @@
|
||||
* 2022-11-14 WangXiaoyao the first version
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#define DBG_TAG "mm.kmem"
|
||||
#define DBG_LVL DBG_INFO
|
||||
#include <rtdbg.h>
|
||||
|
||||
#include "mm_aspace.h"
|
||||
#include "mm_private.h"
|
||||
#include <mmu.h>
|
||||
|
||||
static void list_kernel_space(void)
|
||||
{
|
||||
@@ -30,3 +36,45 @@ void rt_kmem_pvoff_set(rt_ubase_t pvoff)
|
||||
{
|
||||
rt_pv_offset = pvoff;
|
||||
}
|
||||
|
||||
#define _KMEM_LO_OFF(addr) ((rt_ubase_t)(addr) & ARCH_PAGE_MASK)
|
||||
|
||||
int rt_kmem_map_phy(void *va, void *pa, rt_size_t length, rt_size_t attr)
|
||||
{
|
||||
int err;
|
||||
size_t lo_off;
|
||||
lo_off = _KMEM_LO_OFF(pa);
|
||||
|
||||
if (va == RT_NULL)
|
||||
{
|
||||
LOG_E("%s: va NULL is not a valid input", __func__);
|
||||
err = -RT_EINVAL;
|
||||
}
|
||||
else if (_KMEM_LO_OFF(pa) != _KMEM_LO_OFF(va))
|
||||
{
|
||||
LOG_E("%s: misaligned PA(%p) to VA(%p)", __func__, pa, va);
|
||||
err = -RT_EINVAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct rt_mm_va_hint hint = {.flags = MMF_MAP_FIXED,
|
||||
.limit_range_size = rt_kernel_space.size,
|
||||
.limit_start = rt_kernel_space.start,
|
||||
.prefer = va,
|
||||
.map_size = RT_ALIGN(length + lo_off, ARCH_PAGE_SIZE)};
|
||||
|
||||
err = rt_aspace_map_phy(&rt_kernel_space, &hint, attr, MM_PA_TO_OFF(pa), &va);
|
||||
|
||||
if (err)
|
||||
{
|
||||
LOG_W("%s: map %p to %p (%p bytes) failed(err %d)", __func__, pa, va, length, err);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void *rt_kmem_v2p(void *vaddr)
|
||||
{
|
||||
return rt_hw_mmu_v2p(&rt_kernel_space, vaddr);
|
||||
}
|
||||
|
||||
@@ -402,13 +402,18 @@ static rt_page_t (*pages_alloc_handler)(rt_uint32_t size_bits);
|
||||
|
||||
void *rt_pages_alloc(rt_uint32_t size_bits)
|
||||
{
|
||||
void *alloc_buf = RT_NULL;
|
||||
struct rt_page *p;
|
||||
rt_base_t level;
|
||||
|
||||
level = rt_hw_interrupt_disable();
|
||||
p = pages_alloc_handler(size_bits);
|
||||
rt_hw_interrupt_enable(level);
|
||||
return page_to_addr(p);
|
||||
if (p)
|
||||
{
|
||||
alloc_buf = page_to_addr(p);
|
||||
}
|
||||
return alloc_buf;
|
||||
}
|
||||
|
||||
int rt_pages_free(void *addr, rt_uint32_t size_bits)
|
||||
@@ -452,7 +457,7 @@ void list_page(void)
|
||||
rt_kprintf("\n");
|
||||
}
|
||||
rt_hw_interrupt_enable(level);
|
||||
rt_kprintf("free pages is 0x%08x\n", total);
|
||||
rt_kprintf("free pages is 0x%08lx (%ld KB)\n", total, total * ARCH_PAGE_SIZE / 1024);
|
||||
rt_kprintf("-------------------------------\n");
|
||||
}
|
||||
MSH_CMD_EXPORT(list_page, show page info);
|
||||
|
||||
Reference in New Issue
Block a user