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

📄 entry-armv.s

📁 linux-2.4.29操作系统的源码
💻 S
📖 第 1 页 / 共 3 页
字号:
		tst	\irqstat, #0x0f		moveq	\irqstat, \irqstat, lsr #4		addeq	\irqnr, \irqnr, #4		tst	\irqstat, #0x03		moveq	\irqstat, \irqstat, lsr #2		addeq	\irqnr, \irqnr, #2		tst	\irqstat, #0x01		addeqs	\irqnr, \irqnr, #11001:		.endm		.macro	irq_prio_table		.endm#elif defined(CONFIG_ARCH_L7200)#include <asm/hardware.h>			.equ	irq_base_addr,	IO_BASE_2		.macro  disable_fiq		.endm 		.macro  get_irqnr_and_base, irqnr, irqstat, base, tmp		mov     \irqstat, #irq_base_addr		@ Virt addr IRQ regs		add	\irqstat, \irqstat, #0x00001000		@ Status reg		ldr     \irqstat, [\irqstat, #0]		@ get interrupts		mov     \irqnr, #01001:		tst     \irqstat, #1		addeq   \irqnr, \irqnr, #1		moveq   \irqstat, \irqstat, lsr #1		tsteq   \irqnr, #32		beq     1001b		teq     \irqnr, #32		.endm		.macro  irq_prio_table		.endm#elif defined(CONFIG_ARCH_INTEGRATOR)		.macro	disable_fiq		.endm		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp/* FIXME: should not be using soo many LDRs here */		ldr	\irqnr, =IO_ADDRESS(INTEGRATOR_IC_BASE)		ldr	\irqstat, [\irqnr, #IRQ_STATUS]		@ get masked status		ldr	\irqnr, =IO_ADDRESS(INTEGRATOR_HDR_BASE)		ldr	\irqnr, [\irqnr, #(INTEGRATOR_HDR_IC_OFFSET+IRQ_STATUS)]		orr	\irqstat, \irqstat, \irqnr, lsl #INTEGRATOR_CM_INT0		mov	\irqnr, #01001:		tst	\irqstat, #1		bne	1002f		add	\irqnr, \irqnr, #1		mov	\irqstat, \irqstat, lsr #1		cmp	\irqnr, #22		bcc	1001b1002:		/* EQ will be set if we reach 22 */		.endm		.macro	irq_prio_table		.endm#elif defined(CONFIG_ARCH_AT91RM9200)#include <asm/hardware.h>		.macro  disable_fiq		.endm		.macro  get_irqnr_and_base, irqnr, irqstat, base, tmp		ldr	\base, =(AT91C_VA_BASE_SYS)	@ base virtual address of SYS peripherals		ldr	\irqnr, [\base, #AIC_IVR]	@ read IRQ vector register: de-asserts nIRQ to processor (and clears interrupt)		ldr	\irqstat, [\base, #AIC_ISR]	@ read interrupt source number		teq	\irqstat, #0			@ ISR is 0 when no current interrupt, or spurious interrupt		streq   \tmp, [\base, #AIC_EOICR]	@ not going to be handled further, then ACK it now.		.endm		.macro  irq_prio_table		.endm#elif defined(CONFIG_ARCH_MX1ADS)		.macro	disable_fiq		.endm#define AITC_NIVECSR   0x40		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp		ldr	\irqstat, =IO_ADDRESS(MX1ADS_AITC_BASE)		@ Load offset & priority of the highest priority		@ interrupt pending.		ldr	\irqnr, [\irqstat, #AITC_NIVECSR]		@ Shift off the priority leaving the offset or		@ "interrupt number"		mov	\irqnr, \irqnr, lsr #16 		ldr	\irqstat, =1	@ dummy compare		ldr	\base, =0xFFFF		// invalid interrupt		cmp	\irqnr, \base		bne	1001f		ldr	\irqstat, =01001:		tst	\irqstat, #1	@ to make the condition code = TRUE		.endm		.macro	irq_prio_table		.endm#elif defined(CONFIG_ARCH_OMAHA)		.macro	disable_fiq		.endm		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp				/* Read all interrupts pending... */		ldr	\irqnr, =IO_ADDRESS(PLAT_PERIPHERAL_BASE) + OMAHA_INTPND		ldr	\irqstat, [\irqnr]		/* INTPND */		/* All pending irqs are now in \irqstat */		mov	\irqnr, #01001:		tst	\irqstat, #1		bne	1002f		add	\irqnr, \irqnr, #1		mov	\irqstat, \irqstat, lsr #1		cmp	\irqnr, #MAXIRQNUM		bcc	1001b1002:		/* EQ will be set if we reach MAXIRQNUM */		.endm		.macro	irq_prio_table		.endm    #elif defined(CONFIG_ARCH_CLPS711X)#include <asm/hardware/clps7111.h>		.macro	disable_fiq		.endm#if (INTSR2 - INTSR1) != (INTMR2 - INTMR1)#error INTSR stride != INTMR stride#endif		.macro	get_irqnr_and_base, irqnr, stat, base, mask		mov	\base, #CLPS7111_BASE		ldr	\stat, [\base, #INTSR1]		ldr	\mask, [\base, #INTMR1]		mov	\irqnr, #4		mov	\mask, \mask, lsl #16		and	\stat, \stat, \mask, lsr #16		movs	\stat, \stat, lsr #4		bne	1001f		add	\base, \base, #INTSR2 - INTSR1		ldr	\stat, [\base, #INTSR1]		ldr	\mask, [\base, #INTMR1]		mov	\irqnr, #16		mov	\mask, \mask, lsl #16		and	\stat, \stat, \mask, lsr #161001:		tst	\stat, #255		addeq	\irqnr, \irqnr, #8		moveq	\stat, \stat, lsr #8		tst	\stat, #15		addeq	\irqnr, \irqnr, #4		moveq	\stat, \stat, lsr #4		tst	\stat, #3		addeq	\irqnr, \irqnr, #2		moveq	\stat, \stat, lsr #2		tst	\stat, #1		addeq	\irqnr, \irqnr, #1		moveq	\stat, \stat, lsr #1		tst	\stat, #1			@ bit 0 should be set		.endm		.macro	irq_prio_table		.endm	#elif defined (CONFIG_ARCH_CAMELOT)#include <asm/arch/platform.h>#undef IRQ_MODE /* same name defined in asm/proc/ptrace.h */#include <asm/arch/int_ctrl00.h>			.macro	disable_fiq		.endm		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp			ldr	\irqstat, =INT_ID(IO_ADDRESS(EXC_INT_CTRL00_BASE))		ldr	\irqnr,[\irqstat]				cmp	\irqnr,#0		subne	\irqnr,\irqnr,#1			.endm		.macro	irq_prio_table		.endm#elif defined(CONFIG_ARCH_ANAKIN)		.macro	disable_fiq		.endm		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp		mov	\base, #IO_BASE		mov	\irqstat, #INTERRUPT_CONTROLLER		ldr	\tmp, =anakin_irq_mask		ldr	\irqstat, [\base, \irqstat]		ldr	\tmp, [\tmp]		ands	\irqstat, \irqstat, \tmp		ldrne	\tmp, =anakin_active_irqs		strne	\irqstat, [\tmp]		movne	\irqnr, #IRQ_ANAKIN		.endm		.macro	irq_prio_table		.ltorg		.bssENTRY(anakin_irq_mask)		.word	0ENTRY(anakin_active_irqs)		.space	4		.text		.endm#else#error Unknown architecture#endif/* * Invalid mode handlers */__pabt_invalid:	sub	sp, sp, #S_FRAME_SIZE		@ Allocate frame size in one go		stmia	sp, {r0 - lr}			@ Save XXX r0 - lr		ldr	r4, .LCabt		mov	r1, #BAD_PREFETCH		b	1f__dabt_invalid:	sub	sp, sp, #S_FRAME_SIZE		stmia	sp, {r0 - lr}			@ Save SVC r0 - lr [lr *should* be intact]		ldr	r4, .LCabt		mov	r1, #BAD_DATA		b	1f__irq_invalid:	sub	sp, sp, #S_FRAME_SIZE		@ Allocate space on stack for frame		stmfd	sp, {r0 - lr}			@ Save r0 - lr		ldr	r4, .LCirq		mov	r1, #BAD_IRQ		b	1f__und_invalid:	sub	sp, sp, #S_FRAME_SIZE		stmia	sp, {r0 - lr}		ldr	r4, .LCund		mov	r1, #BAD_UNDEFINSTR		@ int reason1:		zero_fp		ldmia	r4, {r5 - r7}			@ Get XXX pc, cpsr, old_r0		add	r4, sp, #S_PC		stmia	r4, {r5 - r7}			@ Save XXX pc, cpsr, old_r0		mov	r0, sp		and	r2, r6, #31			@ int mode		b	SYMBOL_NAME(bad_mode)/* We get here if an undefined instruction happens and the floating * point emulator is not present.  If the offending instruction was * a WFS, we just perform a normal return as if we had emulated the * operation.  This is a hack to allow some basic userland binaries * to run so that the emulator module proper can be loaded. --philb */fpe_not_present:		mov	pc, lr/* * SVC mode handlers */		.align	5__dabt_svc:	sub	sp, sp, #S_FRAME_SIZE		stmia	sp, {r0 - r12}			@ save r0 - r12		ldr	r2, .LCabt		add	r0, sp, #S_FRAME_SIZE		ldmia	r2, {r2 - r4}			@ get pc, cpsr		add	r5, sp, #S_SP		mov	r1, lr		stmia	r5, {r0 - r4}			@ save sp_SVC, lr_SVC, pc, cpsr, old_ro		mrs	r9, cpsr			@ Enable interrupts if they were		tst	r3, #I_BIT		biceq	r9, r9, #I_BIT			@ previously		mov	r0, r2				@ *** remove once everyones in sync/* * This routine must not corrupt r9 */#ifdef MULTI_CPU		ldr	r4, .LCprocfns			@ pass r0, r3 to		mov	lr, pc				@ processor code		ldr	pc, [r4]			@ call processor specific code#else		bl	cpu_data_abort#endif		msr	cpsr_c, r9		mov	r2, sp		bl	SYMBOL_NAME(do_DataAbort)		mov	r0, #I_BIT | MODE_SVC		msr	cpsr_c, r0		ldr	r0, [sp, #S_PSR]		msr	spsr, r0		ldmia	sp, {r0 - pc}^			@ load r0 - pc, cpsr		.align	5__irq_svc:	sub	sp, sp, #S_FRAME_SIZE		stmia	sp, {r0 - r12}			@ save r0 - r12		ldr	r7, .LCirq		add	r5, sp, #S_FRAME_SIZE		ldmia	r7, {r7 - r9}		add	r4, sp, #S_SP		mov	r6, lr		stmia	r4, {r5, r6, r7, r8, r9}	@ save sp_SVC, lr_SVC, pc, cpsr, old_ro1:		get_irqnr_and_base r0, r6, r5, lr		movne	r1, sp		@		@ routine called with r0 = irq number, r1 = struct pt_regs *		@		adrsvc	ne, lr, 1b		bne	asm_do_IRQ		ldr	r0, [sp, #S_PSR]		@ irqs are already disabled		msr	spsr, r0		ldmia	sp, {r0 - pc}^			@ load r0 - pc, cpsr		.ltorg		.align	5__und_svc:	sub	sp, sp, #S_FRAME_SIZE		stmia	sp, {r0 - r12}			@ save r0 - r12		ldr	r7, .LCund		mov	r6, lr		ldmia	r7, {r7 - r9}		add	r5, sp, #S_FRAME_SIZE		add	r4, sp, #S_SP		stmia	r4, {r5 - r9}			@ save sp_SVC, lr_SVC, pc, cpsr, old_ro		adrsvc	al, r9, 1f			@ r9  = normal FP return		bl	call_fpe			@ lr  = undefined instr return		mov	r0, r5				@ unsigned long pc		mov	r1, sp				@ struct pt_regs *regs		bl	SYMBOL_NAME(do_undefinstr)1:		mov	r0, #I_BIT | MODE_SVC		msr	cpsr_c, r0		ldr	lr, [sp, #S_PSR]		@ Get SVC cpsr		msr	spsr, lr		ldmia	sp, {r0 - pc}^			@ Restore SVC registers		.align	5__pabt_svc:	sub	sp, sp, #S_FRAME_SIZE		stmia	sp, {r0 - r12}			@ save r0 - r12		ldr	r2, .LCabt		add	r0, sp, #S_FRAME_SIZE		ldmia	r2, {r2 - r4}			@ get pc, cpsr		add	r5, sp, #S_SP		mov	r1, lr		stmia	r5, {r0 - r4}			@ save sp_SVC, lr_SVC, pc, cpsr, old_ro		mrs	r9, cpsr			@ Enable interrupts if they were		tst	r3, #I_BIT		biceq	r9, r9, #I_BIT			@ previously		msr	cpsr_c, r9		mov	r0, r2				@ address (pc)		mov	r1, sp				@ regs		bl	SYMBOL_NAME(do_PrefetchAbort)	@ call abort handler		mov	r0, #I_BIT | MODE_SVC		msr	cpsr_c, r0		ldr	r0, [sp, #S_PSR]		msr	spsr, r0		ldmia	sp, {r0 - pc}^			@ load r0 - pc, cpsr		.align	5.LCirq:		.word	__temp_irq.LCund:		.word	__temp_und.LCabt:		.word	__temp_abt#ifdef MULTI_CPU.LCprocfns:	.word	SYMBOL_NAME(processor)#endif.LCfp:		.word	SYMBOL_NAME(fp_enter)		irq_prio_table/* * User mode handlers */		.align	5__dabt_usr:	sub	sp, sp, #S_FRAME_SIZE		@ Allocate frame size in one go

⌨️ 快捷键说明

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