mpu缺页模拟支持
This commit is contained in:
@@ -15,8 +15,8 @@ enum vpage_prot_attrs
|
||||
VPAGE_PROT_IN_KNL = 0x20, //!< 内核中使用
|
||||
};
|
||||
|
||||
#define VMA_ADDR_RESV 0x1 //!< 保留内存
|
||||
// #define VMA_ADDR_UNCACHE 0x2 //!< uncache内存
|
||||
#define VMA_ADDR_RESV 0x1 //!< flags 保留内存
|
||||
#define VMA_ADDR_PAGE_FAULT_SIM 0x2 //!< page fault模拟
|
||||
|
||||
typedef union vma_addr
|
||||
{
|
||||
|
||||
@@ -53,7 +53,8 @@ static void vmm_press_block_test(CuTest *cu)
|
||||
for (i = 0; i < TEST_MEM_CN; i++)
|
||||
{
|
||||
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), TEST_MM_SIZE, 0, &addr);
|
||||
if (msg_tag_get_val(tag) < 0) {
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
memset((void *)addr, 0x55, TEST_MM_SIZE);
|
||||
@@ -77,6 +78,53 @@ static void vmm_press_block_test(CuTest *cu)
|
||||
#undef TEST_MM_SIZE
|
||||
#undef TEST_MEM_CN
|
||||
}
|
||||
#if IS_ENABLED(CONFIG_MPU_PAGE_FAULT_SUPPORT)
|
||||
#define TEST_MEM_CN 30
|
||||
static void vmm_press_block_sim_page_fault_test(CuTest *cu)
|
||||
{
|
||||
int i;
|
||||
int m;
|
||||
addr_t addr;
|
||||
msg_tag_t tag;
|
||||
|
||||
memset(test_main, 0, sizeof(test_main));
|
||||
#define TEST_MM_SIZE (PAGE_SIZE)
|
||||
for (i = 0; i < TEST_MEM_CN; i++)
|
||||
{
|
||||
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0), TEST_MM_SIZE, 0, &addr);
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
memset((void *)addr, 0x55, TEST_MM_SIZE);
|
||||
// printf("alloc umem:0x%lx\n", addr);
|
||||
test_main[i] = (void *)addr;
|
||||
}
|
||||
uint8_t *mem0 = test_main[0];
|
||||
uint8_t *mem1 = test_main[1];
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
*mem0 = *mem1;
|
||||
*mem1 = *mem0;
|
||||
}
|
||||
for (m = 0; m < i; m++)
|
||||
{
|
||||
for (int j = 0; j < TEST_MM_SIZE; j++)
|
||||
{
|
||||
uint8_t *tmp_mm = test_main[m];
|
||||
if (tmp_mm[j] != 0x55)
|
||||
{
|
||||
printf("mem test fail. i:%d j:%d\n", m, j);
|
||||
}
|
||||
assert(tmp_mm[j] == 0x55);
|
||||
}
|
||||
u_vmam_free(VMA_PROT, (addr_t)(test_main[m]), TEST_MM_SIZE);
|
||||
}
|
||||
|
||||
#undef TEST_MM_SIZE
|
||||
#undef TEST_MEM_CN
|
||||
}
|
||||
#endif
|
||||
static CuSuite suite;
|
||||
CuSuite *vmm_test_suite(void)
|
||||
{
|
||||
@@ -87,6 +135,8 @@ CuSuite *vmm_test_suite(void)
|
||||
#endif
|
||||
SUITE_ADD_TEST(&suite, vmm_small_block_test);
|
||||
SUITE_ADD_TEST(&suite, vmm_press_block_test);
|
||||
|
||||
#if IS_ENABLED(CONFIG_MPU_PAGE_FAULT_SUPPORT)
|
||||
SUITE_ADD_TEST(&suite, vmm_press_block_sim_page_fault_test);
|
||||
#endif
|
||||
return &suite;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user