entry-macro.s

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

S
128
字号
/* * include/asm-arm/arch-pnx4008/entry-macro.S * * Low-level IRQ helper macros for PNX4008-based platforms * * 2005-2006 (c) MontaVista Software, Inc. * Author: Vitaly Wool <vwool@ru.mvista.com> * This file is licensed under  the terms of the GNU General Public * License version 2. This program is licensed "as is" without any * warranty of any kind, whether express or implied. */#include "platform.h"#define IO_BASE         0xF0000000#define IO_ADDRESS(x)  (((((x) & 0xff000000) >> 4) | ((x) & 0xfffff)) | IO_BASE)#define INTRC_MASK			0x00#define INTRC_RAW_STAT			0x04#define INTRC_STAT			0x08#define INTRC_POLAR			0x0C#define INTRC_ACT_TYPE			0x10#define INTRC_TYPE			0x14#define SIC1_BASE_INT   32#define SIC2_BASE_INT   64		.macro	disable_fiq		.endm		.macro  get_irqnr_preamble, base, tmp		.endm		.macro  arch_ret_to_user, tmp1, tmp2		.endm		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp/* decode the MIC interrupt numbers */		ldr	\base, =IO_ADDRESS(PNX4008_INTCTRLMIC_BASE)		ldr	\irqstat, [\base, #INTRC_STAT]		cmp	\irqstat,#1<<16		movhs	\irqnr,#16		movlo	\irqnr,#0		movhs	\irqstat,\irqstat,lsr#16		cmp	\irqstat,#1<<8		addhs	\irqnr,\irqnr,#8		movhs	\irqstat,\irqstat,lsr#8		cmp	\irqstat,#1<<4		addhs	\irqnr,\irqnr,#4		movhs	\irqstat,\irqstat,lsr#4		cmp	\irqstat,#1<<2		addhs	\irqnr,\irqnr,#2		movhs	\irqstat,\irqstat,lsr#2		cmp	\irqstat,#1<<1		addhs	\irqnr,\irqnr,#1/* was there an interrupt ? if not then drop out with EQ status */		teq	\irqstat,#0		beq	1003f/* and now check for extended IRQ reasons */		cmp	\irqnr,#1		bls	1003f		cmp	\irqnr,#30		blo	1002f/* IRQ 31,30  : High priority cascade IRQ handle *//* read the correct SIC *//* decoding status after compare : eq is 30 (SIC1) , ne is 31 (SIC2) *//* set the base IRQ number */		ldreq	\base, =IO_ADDRESS(PNX4008_INTCTRLSIC1_BASE)		moveq  \irqnr,#SIC1_BASE_INT		ldrne	\base, =IO_ADDRESS(PNX4008_INTCTRLSIC2_BASE)		movne   \irqnr,#SIC2_BASE_INT		ldr	\irqstat, [\base, #INTRC_STAT]		ldr	\tmp,	  [\base, #INTRC_TYPE]/* and with inverted mask : low priority interrupts  */		and	\irqstat,\irqstat,\tmp		b	1004f1003:/* IRQ 1,0  : Low priority cascade IRQ handle *//* read the correct SIC *//* decoding status after compare : eq is 1 (SIC2) , ne is 0 (SIC1)*//* read the correct SIC *//* set the base IRQ number  */		ldrne	\base, =IO_ADDRESS(PNX4008_INTCTRLSIC1_BASE)		movne   \irqnr,#SIC1_BASE_INT		ldreq	\base, =IO_ADDRESS(PNX4008_INTCTRLSIC2_BASE)		moveq   \irqnr,#SIC2_BASE_INT		ldr	\irqstat, [\base, #INTRC_STAT]		ldr	\tmp,	  [\base, #INTRC_TYPE]/* and with inverted mask : low priority interrupts  */		bic	\irqstat,\irqstat,\tmp1004:		cmp	\irqstat,#1<<16		addhs	\irqnr,\irqnr,#16		movhs	\irqstat,\irqstat,lsr#16		cmp	\irqstat,#1<<8		addhs	\irqnr,\irqnr,#8		movhs	\irqstat,\irqstat,lsr#8		cmp	\irqstat,#1<<4		addhs	\irqnr,\irqnr,#4		movhs	\irqstat,\irqstat,lsr#4		cmp	\irqstat,#1<<2		addhs	\irqnr,\irqnr,#2		movhs	\irqstat,\irqstat,lsr#2		cmp	\irqstat,#1<<1		addhs	\irqnr,\irqnr,#1/* is irqstat not zero */1002:/* we assert that irqstat is not equal to zero and return ne status if true*/		teq	\irqstat,#01003:		.endm		.macro	irq_prio_table		.endm

⌨️ 快捷键说明

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