more test & bugs fix.
This commit is contained in:
@@ -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) \
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user