📄 data_abort.c
字号:
/*
* ApOS (Another Project software for s3c2410)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* Copyright caiyuqing
*
*/
#include "../include/kernel/data_abort.h"
#include "../include/s3c2410/cpu.h"
//#define _ABT_DEBUG
/*
* 处理内存访问错误:
* translation fault
* domain fault
* permission fault
*/
void do_data_abort(struct cpu_registers *regs)
{
unsigned int sfr=read_data_fsr();
unsigned int fault_addr=0;
#ifdef _ABT_DEBUG
printk("data abort.\n");
printk("fault status: ");
#endif
if((((sfr&0x0000000f)>>2)&0x3)==0x0)
{
#ifdef _ABT_DEBUG
printk("alignment abort.\n");
#endif
panic();
}
else
{
switch(sfr&0x0000000f)
{
case FS_TRANSLATION0:
case FS_TRANSLATION1:
fault_addr=read_far();
#ifdef _ABT_DEBUG
printk("translation fault.\n");
printk("fault address :0x%0x\n",fault_addr);
#endif
do_no_page(fault_addr);
break;
case FS_DOMAIN0:
case FS_DOMAIN1:
panic("domain fault.\n");
break;
case FS_PERMISSION0:
case FS_PERMISSION1:
fault_addr=read_far();
#ifdef _ABT_DEBUG
printk("permission fault.\n");
printk("fault address :0x%0x\n",fault_addr);
#endif
do_permission_fault(fault_addr);
break;
case FS_EXTERNAL_ABORT0:
case FS_EXTERNAL_ABORT1:
panic("external abort.\n");
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -