OK6410A 开发板 (八) 117 linux-5.11 OK6410A Prefetch Abort 实例分析

这篇博客详细解析了ARM架构下,特别是PABT(异常处理)流程中的prefetch abort和page fault处理,介绍了短描述符格式的FSR(故障状态寄存器)及其对应的异常处理函数。它涵盖了从异常触发到硬件和软件交互的过程,关键词Sequence for checking faults揭示了核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流程
vector_pabt
	vector_stub pabt, ABT_MODE, 4
	__pabt_usr
		usr_entry
		pabt_helper
			bl  CPU_PABORT_HANDLER // v6_pabort
				do_PrefetchAbort
					const struct fsr_info *inf = ifsr_info + fsr_fs(ifsr);
					inf->fn(addr, ifsr | FSR_LNX_PF, regs);
					pr_alert("Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n", inf->name, ifsr, addr);
					arm_notify_die("", regs, inf->sig, inf->code, (void __user *)addr,ifsr, 0);
		ret_from_exception
	__pabt_svc
		svc_entry
		pabt_helper
		svc_exit r5



arch/arm/mm/fsr-2level.c
	// Short-descriptor format FSR encodings P1406
	static struct fsr_info ifsr_info[] = {
		{ do_bad,		SIGBUS,  0,		"unknown 0"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 1"			   },
		{ do_bad,		SIGBUS,  0,		"debug event"			   },
		{ do_bad,		SIGSEGV, SEGV_ACCERR,	"section access flag fault"	   },
		{ do_bad,		SIGBUS,  0,		"unknown 4"			   },
		{ do_translation_fault,	SIGSEGV, SEGV_MAPERR,	"section translation fault"	   },
		{ do_bad,		SIGSEGV, SEGV_ACCERR,	"page access flag fault"	   },
		{ do_page_fault,	SIGSEGV, SEGV_MAPERR,	"page translation fault"	   },
		{ do_bad,		SIGBUS,	 0,		"external abort on non-linefetch"  },
		{ do_bad,		SIGSEGV, SEGV_ACCERR,	"section domain fault"		   },
		{ do_bad,		SIGBUS,  0,		"unknown 10"			   },
		{ do_bad,		SIGSEGV, SEGV_ACCERR,	"page domain fault"		   },
		{ do_bad,		SIGBUS,	 0,		"external abort on translation"	   },
		{ do_sect_fault,	SIGSEGV, SEGV_ACCERR,	"section permission fault"	   },
		{ do_bad,		SIGBUS,	 0,		"external abort on translation"	   },
		{ do_page_fault,	SIGSEGV, SEGV_ACCERR,	"page permission fault"		   },
		{ do_bad,		SIGBUS,  0,		"unknown 16"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 17"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 18"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 19"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 20"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 21"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 22"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 23"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 24"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 25"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 26"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 27"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 28"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 29"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 30"			   },
		{ do_bad,		SIGBUS,  0,		"unknown 31"			   },
	};

硬件流程
  • 关键字 “Sequence for checking faults”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值