cplbhdlr.s

来自「linux 内核源代码」· S 代码 · 共 131 行

S
131
字号
/* * File:         arch/blackfin/mach-common/cplbhdlr.S * Based on: * Author:       LG Soft India * * Created:      ? * Description:  CPLB exception handler * * Modified: *               Copyright 2004-2006 Analog Devices Inc. * * Bugs:         Enter bugs at http://blackfin.uclinux.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see the file COPYING, or write * to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */#include <linux/linkage.h>#include <asm/cplb.h>#include <asm/entry.h>#ifdef CONFIG_EXCPT_IRQ_SYSC_L1.section .l1.text#else.text#endif.type _cplb_mgr, STT_FUNC;.type _panic_cplb_error, STT_FUNC;.align 2ENTRY(__cplb_hdr)	R2 = SEQSTAT;	/* Mask the contents of SEQSTAT and leave only EXCAUSE in R2 */	R2 <<= 26;	R2 >>= 26;	R1 = 0x23; /* Data access CPLB protection violation */	CC = R2 == R1;	IF !CC JUMP .Lnot_data_write;	R0 = 2;		/* is a write to data space*/	JUMP .Lis_icplb_miss;.Lnot_data_write:	R1 = 0x2C; /* CPLB miss on an instruction fetch */	CC = R2 == R1;	R0 = 0;		/* is_data_miss == False*/	IF CC JUMP .Lis_icplb_miss;	R1 = 0x26;	CC = R2 == R1;	IF !CC JUMP .Lunknown;	R0 = 1;		/* is_data_miss == True*/.Lis_icplb_miss:#if defined(CONFIG_BFIN_ICACHE) || defined(CONFIG_BFIN_DCACHE)# if defined(CONFIG_BFIN_ICACHE) && !defined(CONFIG_BFIN_DCACHE)	R1 = CPLB_ENABLE_ICACHE;# endif# if !defined(CONFIG_BFIN_ICACHE) && defined(CONFIG_BFIN_DCACHE)	R1 = CPLB_ENABLE_DCACHE;# endif# if defined(CONFIG_BFIN_ICACHE) && defined(CONFIG_BFIN_DCACHE)	R1 = CPLB_ENABLE_DCACHE | CPLB_ENABLE_ICACHE;# endif#else	R1 = 0;#endif	[--SP] = RETS;	CALL _cplb_mgr;	RETS = [SP++];	CC = R0 == 0;	IF !CC JUMP .Lnot_replaced;	RTS;/* * Diagnostic exception handlers */.Lunknown:	R0 = CPLB_UNKNOWN_ERR;	JUMP .Lcplb_error;.Lnot_replaced:	CC = R0 == CPLB_NO_UNLOCKED;	IF !CC JUMP .Lnext_check;	R0 = CPLB_NO_UNLOCKED;	JUMP .Lcplb_error;.Lnext_check:	CC = R0 == CPLB_NO_ADDR_MATCH;	IF !CC JUMP .Lnext_check2;	R0 = CPLB_NO_ADDR_MATCH;	JUMP .Lcplb_error;.Lnext_check2:	CC = R0 == CPLB_PROT_VIOL;	IF !CC JUMP .Lstrange_return_from_cplb_mgr;	R0 = CPLB_PROT_VIOL;	JUMP .Lcplb_error;.Lstrange_return_from_cplb_mgr:	IDLE;	CSYNC;	JUMP .Lstrange_return_from_cplb_mgr;.Lcplb_error:	R1 = sp;	SP += -12;	call _panic_cplb_error;	SP += 12;	JUMP _handle_bad_cplb;ENDPROC(__cplb_hdr)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?