⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data_abort.c

📁 os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm
💻 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 + -