more test & bugs fix.

This commit is contained in:
zhangzheng
2024-08-27 23:02:54 +08:00
parent 0420d74f2c
commit 8c66a42859
72 changed files with 1164 additions and 472 deletions

View File

@@ -139,6 +139,11 @@ typedef struct sp_info
#endif
} sp_info_t;
#define flush_all_tlb() \
do { \
/*asm volatile("tlbi alle2");*/\
asm volatile("tlbi alle1");\
} while (0)
#define cpu_sleep() asm volatile("wfi" : : : "memory")
#define _barrier() __asm__ __volatile__("" : : : "memory")
#define _dmb(ins) \

View File

@@ -2,6 +2,7 @@
#include <asm/mm.h>
#include "mm_page.h"
#include <mmu.h>
#include <string.h>
int page_entry_init(page_entry_t *entry)
{
entry->dir = buddy_alloc(buddy_get_alloter(), PAGE_SIZE);
@@ -10,6 +11,7 @@ int page_entry_init(page_entry_t *entry)
{
return -ENOMEM;
}
memset(entry->dir, 0, PAGE_SIZE);
knl_pdir_init(entry, entry->dir, 3);
return 0;
}

View File

@@ -101,7 +101,7 @@ pte_t *pages_walk(page_entry_t *pdir, addr_t virt_addr, mword_t order, void *(*f
int i;
pte_t *next = &pdir->dir[(virt_addr >> pdir->lv_shift_sizes[(PAGE_DEEP - pdir->depth)]) & 0x1ffUL];
// 找到所在深度
// 找到所在深度
for (i = (PAGE_DEEP - pdir->depth); i < PAGE_DEEP; i++)
{
if (pdir->lv_shift_sizes[i] == order)
@@ -162,7 +162,7 @@ int unmap_mm(page_entry_t *pdir, addr_t virt_addr, mword_t page_order, mword_t p
{
for (mword_t i = 0; i < pfn_cn; i++)
{
pte_t *pte = pages_walk(pdir, virt_addr + (i << page_order), page_order, NULL);
pte_t *pte = pages_walk(pdir, virt_addr + (i << page_order), page_order, page_alloc_cb);
if (pte != NULL)
{

View File

@@ -49,3 +49,5 @@ umword_t mm_get_paddr(page_entry_t *pdir, addr_t virt_addr, mword_t page_order);
void per_cpu_boot_mapping(bool_t init_pages);
page_entry_t *boot_get_pdir(void);
void knl_pdir_init(page_entry_t *pdir, pte_t *dir, int page_deep);
void flush_cache_range(void *start, void *end);

View File

@@ -20,7 +20,6 @@ static void sw_mmu(thread_t *next_thread)
{
assert(get_sp());
// _dsb(sy);
write_sysreg(p_next_dir | (next_task->mm_space.asid << 48) /*TODO:*/, vttbr_el2); // 切换用户态页表
_isb();
// asm volatile("ic iallu");

View File

@@ -76,8 +76,6 @@ static int thread_exec_to_vcpu(thread_t *th, entry_frame_t *regs, umword_t esr,
if (ret >= 0)
{
*regs = *dst_pf;
// regs->pc = dst_pf->pc; /*TODO:可能还有其他信息*/
// regs->pstate = dst_pf->pstate;
}
else
{
@@ -114,6 +112,7 @@ void thread_sync_entry(entry_frame_t *regs)
if (ret < 0)
{
printk("[knl] inst abort 0x20 pfa:0x%lx\n", addr);
dump_stack(regs->pc, regs->regs[29]);
task_knl_kill(th, FALSE);
}
break;
@@ -132,6 +131,7 @@ void thread_sync_entry(entry_frame_t *regs)
ret = task_vma_page_fault(&tk->mm_space.mem_vma, ALIGN_DOWN(addr, PAGE_SIZE));
if (ret < 0)
{
dump_stack(regs->pc, regs->regs[29]);
task_knl_kill(th, FALSE);
}
break;
@@ -144,10 +144,12 @@ void thread_sync_entry(entry_frame_t *regs)
ret = thread_exec_to_vcpu(th, regs, esr, addr);
if (ret < 0)
{
dump_stack(regs->pc, regs->regs[29]);
task_knl_kill(th, FALSE);
}
// printk("%s:%d ret:%d\n", __func__, __LINE__, ret);
#else
dump_stack(regs->pc, regs->regs[29]);
task_knl_kill(th, FALSE);
#endif
break;