增加mem fault的错误处理流程[默认杀死当前task]
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
#include "mm_man.h"
|
||||
#include "task.h"
|
||||
#include "thread.h"
|
||||
#include "map.h"
|
||||
/** @addtogroup Template_Project
|
||||
* @{
|
||||
*/
|
||||
@@ -66,11 +67,11 @@ void NMI_Handler(void)
|
||||
void HardFault_Handler(void)
|
||||
{
|
||||
printk("%s\n", __FUNCTION__);
|
||||
|
||||
task_kill(thread_get_current_task());
|
||||
/* Go to infinite loop when Hard Fault exception occurs */
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
// while (1)
|
||||
// {
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -101,9 +102,10 @@ void MemManage_Handler(void)
|
||||
{
|
||||
printk("semgement fault.\n");
|
||||
/*TODO:杀死进程*/
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
// while (1)
|
||||
// {
|
||||
// }
|
||||
goto end;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -116,24 +118,23 @@ void MemManage_Handler(void)
|
||||
{
|
||||
printk("semgement fault.\n");
|
||||
/*TODO:杀死进程*/
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
// while (1)
|
||||
// {
|
||||
// }
|
||||
goto end;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (SCB->CFSR & 16)
|
||||
{
|
||||
printk("压栈错误\n");
|
||||
fault_addr = arch_get_user_sp();
|
||||
fault_addr = arch_get_user_sp();
|
||||
|
||||
if (mm_page_alloc_fault(&cur_task->mm_space.mm_pages, fault_addr) == NULL)
|
||||
{
|
||||
printk("semgement fault.\n");
|
||||
/*TODO:杀死进程*/
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
goto end;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -142,17 +143,13 @@ void MemManage_Handler(void)
|
||||
printk("浮点惰性压栈错误\n");
|
||||
}
|
||||
|
||||
|
||||
// else
|
||||
printk("semgement fault.\n");
|
||||
/*TODO:杀死进程*/
|
||||
// while (1)
|
||||
// {
|
||||
printk("semgement fault.\n");
|
||||
/*TODO:杀死进程*/
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
// }
|
||||
// thread_sched();
|
||||
/* Go to infinite loop when Memory Manage exception occurs */
|
||||
end:
|
||||
task_kill(thread_get_current_task());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -165,9 +162,10 @@ void BusFault_Handler(void)
|
||||
printk("%s\n", __FUNCTION__);
|
||||
|
||||
/* Go to infinite loop when Bus Fault exception occurs */
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
// while (1)
|
||||
// {
|
||||
// }
|
||||
task_kill(thread_get_current_task());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -203,9 +201,10 @@ void UsageFault_Handler(void)
|
||||
printk("除零错误\n");
|
||||
}
|
||||
/* Go to infinite loop when Usage Fault exception occurs */
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
// while (1)
|
||||
// {
|
||||
// }
|
||||
task_kill(thread_get_current_task());
|
||||
}
|
||||
|
||||
// /**
|
||||
|
||||
@@ -21,3 +21,4 @@ typedef struct task
|
||||
void task_init(task_t *task, ram_limit_t *ram, int is_knl);
|
||||
task_t *task_create(ram_limit_t *lim, int is_knl);
|
||||
int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size);
|
||||
void task_kill(task_t *tk);
|
||||
|
||||
@@ -173,7 +173,14 @@ static void task_release_stage2(kobject_t *kobj)
|
||||
}
|
||||
printk("release tk %x\n", tk);
|
||||
}
|
||||
|
||||
void task_kill(task_t *tk)
|
||||
{
|
||||
kobj_del_list_t kobj_list;
|
||||
kobj_del_list_init(&kobj_list);
|
||||
obj_unmap(&tk->obj_space, vpage_create3(KOBJ_DELETE_RIGHT, 0, TASK_PROT), &kobj_list);
|
||||
kobj_del_list_to_do(&kobj_list);
|
||||
thread_sched();
|
||||
}
|
||||
task_t *task_create(ram_limit_t *lim, int is_knl)
|
||||
{
|
||||
task_t *tk = mm_limit_alloc(lim, sizeof(task_t));
|
||||
|
||||
@@ -22,7 +22,6 @@ int main(int argc, char *args[])
|
||||
{
|
||||
// futex_init();
|
||||
ulog_write_str(LOG_PROT, "init..\n");
|
||||
// mpu_test();
|
||||
#if 0
|
||||
ulog_test();
|
||||
factory_test();
|
||||
@@ -33,6 +32,7 @@ int main(int argc, char *args[])
|
||||
ipc_timeout_test();
|
||||
mm_test();
|
||||
app_test();
|
||||
mpu_test();
|
||||
#endif
|
||||
ipc_test();
|
||||
uenv_t env = *u_get_global_env();
|
||||
|
||||
@@ -15,5 +15,5 @@ void factory_test(void)
|
||||
printf("factory_create_ipc no memory\n");
|
||||
return;
|
||||
}
|
||||
task_unmap(TASK_PROT, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, hd));
|
||||
handler_free_umap(hd);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user