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

📄 head_64.s

📁 linux-2.6.15.6
💻 S
📖 第 1 页 / 共 4 页
字号:
	STD_EXCEPTION_PSERIES(0x1300, instruction_breakpoint)	STD_EXCEPTION_PSERIES(0x1700, altivec_assist)	. = 0x3000/*** pSeries interrupt support ***/	/* moved from 0xf00 */	STD_EXCEPTION_PSERIES(., performance_monitor)	.align	7_GLOBAL(do_stab_bolted_pSeries)	mtcrf	0x80,r12	mfspr	r12,SPRN_SPRG2	EXCEPTION_PROLOG_PSERIES(PACA_EXSLB, .do_stab_bolted)/* * We have some room here  we use that to put * the peries slb miss user trampoline code so it's reasonably * away from slb_miss_user_common to avoid problems with rfid * * This is used for when the SLB miss handler has to go virtual, * which doesn't happen for now anymore but will once we re-implement * dynamic VSIDs for shared page tables */#ifdef __DISABLED__slb_miss_user_pseries:	std	r10,PACA_EXGEN+EX_R10(r13)	std	r11,PACA_EXGEN+EX_R11(r13)	std	r12,PACA_EXGEN+EX_R12(r13)	mfspr	r10,SPRG1	ld	r11,PACA_EXSLB+EX_R9(r13)	ld	r12,PACA_EXSLB+EX_R3(r13)	std	r10,PACA_EXGEN+EX_R13(r13)	std	r11,PACA_EXGEN+EX_R9(r13)	std	r12,PACA_EXGEN+EX_R3(r13)	clrrdi	r12,r13,32	mfmsr	r10	mfspr	r11,SRR0			/* save SRR0 */	ori	r12,r12,slb_miss_user_common@l	/* virt addr of handler */	ori	r10,r10,MSR_IR|MSR_DR|MSR_RI	mtspr	SRR0,r12	mfspr	r12,SRR1			/* and SRR1 */	mtspr	SRR1,r10	rfid	b	.				/* prevent spec. execution */#endif /* __DISABLED__ *//* * Vectors for the FWNMI option.  Share common code. */	.globl system_reset_fwnmisystem_reset_fwnmi:	HMT_MEDIUM	mtspr	SPRN_SPRG1,r13		/* save r13 */	RUNLATCH_ON(r13)	EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common)	.globl machine_check_fwnmimachine_check_fwnmi:	HMT_MEDIUM	mtspr	SPRN_SPRG1,r13		/* save r13 */	RUNLATCH_ON(r13)	EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common)#ifdef CONFIG_PPC_ISERIES/***  ISeries-LPAR interrupt handlers ***/	STD_EXCEPTION_ISERIES(0x200, machine_check, PACA_EXMC)	.globl data_access_iSeriesdata_access_iSeries:	mtspr	SPRN_SPRG1,r13BEGIN_FTR_SECTION	mtspr	SPRN_SPRG2,r12	mfspr	r13,SPRN_DAR	mfspr	r12,SPRN_DSISR	srdi	r13,r13,60	rlwimi	r13,r12,16,0x20	mfcr	r12	cmpwi	r13,0x2c	beq	.do_stab_bolted_iSeries	mtcrf	0x80,r12	mfspr	r12,SPRN_SPRG2END_FTR_SECTION_IFCLR(CPU_FTR_SLB)	EXCEPTION_PROLOG_ISERIES_1(PACA_EXGEN)	EXCEPTION_PROLOG_ISERIES_2	b	data_access_common.do_stab_bolted_iSeries:	mtcrf	0x80,r12	mfspr	r12,SPRN_SPRG2	EXCEPTION_PROLOG_ISERIES_1(PACA_EXSLB)	EXCEPTION_PROLOG_ISERIES_2	b	.do_stab_bolted	.globl	data_access_slb_iSeriesdata_access_slb_iSeries:	mtspr	SPRN_SPRG1,r13		/* save r13 */	mfspr	r13,SPRN_SPRG3		/* get paca address into r13 */	std	r3,PACA_EXSLB+EX_R3(r13)	mfspr	r3,SPRN_DAR	std	r9,PACA_EXSLB+EX_R9(r13)	mfcr	r9#ifdef __DISABLED__	cmpdi	r3,0	bge	slb_miss_user_iseries#endif	std	r10,PACA_EXSLB+EX_R10(r13)	std	r11,PACA_EXSLB+EX_R11(r13)	std	r12,PACA_EXSLB+EX_R12(r13)	mfspr	r10,SPRN_SPRG1	std	r10,PACA_EXSLB+EX_R13(r13)	ld	r12,PACALPPACA+LPPACASRR1(r13);	b	.slb_miss_realmode	STD_EXCEPTION_ISERIES(0x400, instruction_access, PACA_EXGEN)	.globl	instruction_access_slb_iSeriesinstruction_access_slb_iSeries:	mtspr	SPRN_SPRG1,r13		/* save r13 */	mfspr	r13,SPRN_SPRG3		/* get paca address into r13 */	std	r3,PACA_EXSLB+EX_R3(r13)	ld	r3,PACALPPACA+LPPACASRR0(r13)	/* get SRR0 value */	std	r9,PACA_EXSLB+EX_R9(r13)	mfcr	r9#ifdef __DISABLED__	cmpdi	r3,0	bge	.slb_miss_user_iseries#endif	std	r10,PACA_EXSLB+EX_R10(r13)	std	r11,PACA_EXSLB+EX_R11(r13)	std	r12,PACA_EXSLB+EX_R12(r13)	mfspr	r10,SPRN_SPRG1	std	r10,PACA_EXSLB+EX_R13(r13)	ld	r12,PACALPPACA+LPPACASRR1(r13);	b	.slb_miss_realmode#ifdef __DISABLED__slb_miss_user_iseries:	std	r10,PACA_EXGEN+EX_R10(r13)	std	r11,PACA_EXGEN+EX_R11(r13)	std	r12,PACA_EXGEN+EX_R12(r13)	mfspr	r10,SPRG1	ld	r11,PACA_EXSLB+EX_R9(r13)	ld	r12,PACA_EXSLB+EX_R3(r13)	std	r10,PACA_EXGEN+EX_R13(r13)	std	r11,PACA_EXGEN+EX_R9(r13)	std	r12,PACA_EXGEN+EX_R3(r13)	EXCEPTION_PROLOG_ISERIES_2	b	slb_miss_user_common#endif	MASKABLE_EXCEPTION_ISERIES(0x500, hardware_interrupt)	STD_EXCEPTION_ISERIES(0x600, alignment, PACA_EXGEN)	STD_EXCEPTION_ISERIES(0x700, program_check, PACA_EXGEN)	STD_EXCEPTION_ISERIES(0x800, fp_unavailable, PACA_EXGEN)	MASKABLE_EXCEPTION_ISERIES(0x900, decrementer)	STD_EXCEPTION_ISERIES(0xa00, trap_0a, PACA_EXGEN)	STD_EXCEPTION_ISERIES(0xb00, trap_0b, PACA_EXGEN)	.globl	system_call_iSeriessystem_call_iSeries:	mr	r9,r13	mfspr	r13,SPRN_SPRG3	EXCEPTION_PROLOG_ISERIES_2	b	system_call_common	STD_EXCEPTION_ISERIES( 0xd00, single_step, PACA_EXGEN)	STD_EXCEPTION_ISERIES( 0xe00, trap_0e, PACA_EXGEN)	STD_EXCEPTION_ISERIES( 0xf00, performance_monitor, PACA_EXGEN)	.globl system_reset_iSeriessystem_reset_iSeries:	mfspr	r13,SPRN_SPRG3		/* Get paca address */	mfmsr	r24	ori	r24,r24,MSR_RI	mtmsrd	r24			/* RI on */	lhz	r24,PACAPACAINDEX(r13)	/* Get processor # */	cmpwi	0,r24,0			/* Are we processor 0? */	beq	.__start_initialization_iSeries	/* Start up the first processor */	mfspr	r4,SPRN_CTRLF	li	r5,CTRL_RUNLATCH	/* Turn off the run light */	andc	r4,r4,r5	mtspr	SPRN_CTRLT,r41:	HMT_LOW#ifdef CONFIG_SMP	lbz	r23,PACAPROCSTART(r13)	/* Test if this processor					 * should start */	sync	LOADADDR(r3,current_set)	sldi	r28,r24,3		/* get current_set[cpu#] */	ldx	r3,r3,r28	addi	r1,r3,THREAD_SIZE	subi	r1,r1,STACK_FRAME_OVERHEAD	cmpwi	0,r23,0	beq	iSeries_secondary_smp_loop	/* Loop until told to go */	bne	.__secondary_start		/* Loop until told to go */iSeries_secondary_smp_loop:	/* Let the Hypervisor know we are alive */	/* 8002 is a call to HvCallCfg::getLps, a harmless Hypervisor function */	lis	r3,0x8002	rldicr	r3,r3,32,15		/* r0 = (r3 << 32) & 0xffff000000000000 */#else /* CONFIG_SMP */	/* Yield the processor.  This is required for non-SMP kernels		which are running on multi-threaded machines. */	lis	r3,0x8000	rldicr	r3,r3,32,15		/* r3 = (r3 << 32) & 0xffff000000000000 */	addi	r3,r3,18		/* r3 = 0x8000000000000012 which is "yield" */	li	r4,0			/* "yield timed" */	li	r5,-1			/* "yield forever" */#endif /* CONFIG_SMP */	li	r0,-1			/* r0=-1 indicates a Hypervisor call */	sc				/* Invoke the hypervisor via a system call */	mfspr	r13,SPRN_SPRG3		/* Put r13 back ???? */	b	1b			/* If SMP not configured, secondaries					 * loop forever */	.globl decrementer_iSeries_maskeddecrementer_iSeries_masked:	li	r11,1	stb	r11,PACALPPACA+LPPACADECRINT(r13)	lwz	r12,PACADEFAULTDECR(r13)	mtspr	SPRN_DEC,r12	/* fall through */	.globl hardware_interrupt_iSeries_maskedhardware_interrupt_iSeries_masked:	mtcrf	0x80,r9		/* Restore regs */	ld	r11,PACALPPACA+LPPACASRR0(r13)	ld	r12,PACALPPACA+LPPACASRR1(r13)	mtspr	SPRN_SRR0,r11	mtspr	SPRN_SRR1,r12	ld	r9,PACA_EXGEN+EX_R9(r13)	ld	r10,PACA_EXGEN+EX_R10(r13)	ld	r11,PACA_EXGEN+EX_R11(r13)	ld	r12,PACA_EXGEN+EX_R12(r13)	ld	r13,PACA_EXGEN+EX_R13(r13)	rfid	b	.	/* prevent speculative execution */#endif /* CONFIG_PPC_ISERIES *//*** Common interrupt handlers ***/	STD_EXCEPTION_COMMON(0x100, system_reset, .system_reset_exception)	/*	 * Machine check is different because we use a different	 * save area: PACA_EXMC instead of PACA_EXGEN.	 */	.align	7	.globl machine_check_commonmachine_check_common:	EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC)	DISABLE_INTS	bl	.save_nvgprs	addi	r3,r1,STACK_FRAME_OVERHEAD	bl	.machine_check_exception	b	.ret_from_except	STD_EXCEPTION_COMMON_LITE(0x900, decrementer, .timer_interrupt)	STD_EXCEPTION_COMMON(0xa00, trap_0a, .unknown_exception)	STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception)	STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception)	STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception)	STD_EXCEPTION_COMMON(0xf00, performance_monitor, .performance_monitor_exception)	STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception)#ifdef CONFIG_ALTIVEC	STD_EXCEPTION_COMMON(0x1700, altivec_assist, .altivec_assist_exception)#else	STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception)#endif/* * Here we have detected that the kernel stack pointer is bad. * R9 contains the saved CR, r13 points to the paca, * r10 contains the (bad) kernel stack pointer, * r11 and r12 contain the saved SRR0 and SRR1. * We switch to using an emergency stack, save the registers there, * and call kernel_bad_stack(), which panics. */bad_stack:	ld	r1,PACAEMERGSP(r13)	subi	r1,r1,64+INT_FRAME_SIZE	std	r9,_CCR(r1)	std	r10,GPR1(r1)	std	r11,_NIP(r1)	std	r12,_MSR(r1)	mfspr	r11,SPRN_DAR	mfspr	r12,SPRN_DSISR	std	r11,_DAR(r1)	std	r12,_DSISR(r1)	mflr	r10	mfctr	r11	mfxer	r12	std	r10,_LINK(r1)	std	r11,_CTR(r1)	std	r12,_XER(r1)	SAVE_GPR(0,r1)	SAVE_GPR(2,r1)	SAVE_4GPRS(3,r1)	SAVE_2GPRS(7,r1)	SAVE_10GPRS(12,r1)	SAVE_10GPRS(22,r1)	addi	r11,r1,INT_FRAME_SIZE	std	r11,0(r1)	li	r12,0	std	r12,0(r11)	ld	r2,PACATOC(r13)1:	addi	r3,r1,STACK_FRAME_OVERHEAD	bl	.kernel_bad_stack	b	1b/* * Return from an exception with minimal checks. * The caller is assumed to have done EXCEPTION_PROLOG_COMMON. * If interrupts have been enabled, or anything has been * done that might have changed the scheduling status of * any task or sent any task a signal, you should use * ret_from_except or ret_from_except_lite instead of this. */	.globl	fast_exception_returnfast_exception_return:	ld	r12,_MSR(r1)	ld	r11,_NIP(r1)	andi.	r3,r12,MSR_RI		/* check if RI is set */	beq-	unrecov_fer	ld	r3,_CCR(r1)	ld	r4,_LINK(r1)	ld	r5,_CTR(r1)	ld	r6,_XER(r1)	mtcr	r3	mtlr	r4	mtctr	r5	mtxer	r6	REST_GPR(0, r1)	REST_8GPRS(2, r1)	mfmsr	r10	clrrdi	r10,r10,2		/* clear RI (LE is 0 already) */	mtmsrd	r10,1	mtspr	SPRN_SRR1,r12	mtspr	SPRN_SRR0,r11	REST_4GPRS(10, r1)	ld	r1,GPR1(r1)	rfid	b	.	/* prevent speculative execution */unrecov_fer:	bl	.save_nvgprs1:	addi	r3,r1,STACK_FRAME_OVERHEAD	bl	.unrecoverable_exception	b	1b/* * Here r13 points to the paca, r9 contains the saved CR, * SRR0 and SRR1 are saved in r11 and r12, * r9 - r13 are saved in paca->exgen. */	.align	7	.globl data_access_commondata_access_common:	RUNLATCH_ON(r10)		/* It wont fit in the 0x300 handler */	mfspr	r10,SPRN_DAR	std	r10,PACA_EXGEN+EX_DAR(r13)	mfspr	r10,SPRN_DSISR	stw	r10,PACA_EXGEN+EX_DSISR(r13)	EXCEPTION_PROLOG_COMMON(0x300, PACA_EXGEN)	ld	r3,PACA_EXGEN+EX_DAR(r13)	lwz	r4,PACA_EXGEN+EX_DSISR(r13)	li	r5,0x300	b	.do_hash_page	 	/* Try to handle as hpte fault */	.align	7	.globl instruction_access_commoninstruction_access_common:	EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN)	ld	r3,_NIP(r1)	andis.	r4,r12,0x5820	li	r5,0x400	b	.do_hash_page		/* Try to handle as hpte fault *//* * Here is the common SLB miss user that is used when going to virtual * mode for SLB misses, that is currently not used */#ifdef __DISABLED__	.align	7	.globl	slb_miss_user_commonslb_miss_user_common:	mflr	r10	std	r3,PACA_EXGEN+EX_DAR(r13)	stw	r9,PACA_EXGEN+EX_CCR(r13)	std	r10,PACA_EXGEN+EX_LR(r13)	std	r11,PACA_EXGEN+EX_SRR0(r13)	bl	.slb_allocate_user	ld	r10,PACA_EXGEN+EX_LR(r13)	ld	r3,PACA_EXGEN+EX_R3(r13)	lwz	r9,PACA_EXGEN+EX_CCR(r13)	ld	r11,PACA_EXGEN+EX_SRR0(r13)	mtlr	r10	beq-	slb_miss_fault	andi.	r10,r12,MSR_RI		/* check for unrecoverable exception */	beq-	unrecov_user_slb	mfmsr	r10.machine push.machine "power4"	mtcrf	0x80,r9.machine pop	clrrdi	r10,r10,2		/* clear RI before setting SRR0/1 */	mtmsrd	r10,1	mtspr	SRR0,r11	mtspr	SRR1,r12	ld	r9,PACA_EXGEN+EX_R9(r13)	ld	r10,PACA_EXGEN+EX_R10(r13)	ld	r11,PACA_EXGEN+EX_R11(r13)	ld	r12,PACA_EXGEN+EX_R12(r13)	ld	r13,PACA_EXGEN+EX_R13(r13)	rfid	b	.slb_miss_fault:	EXCEPTION_PROLOG_COMMON(0x380, PACA_EXGEN)	ld	r4,PACA_EXGEN+EX_DAR(r13)	li	r5,0	std	r4,_DAR(r1)	std	r5,_DSISR(r1)	b	.handle_page_faultunrecov_user_slb:	EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN)	DISABLE_INTS	bl	.save_nvgprs1:	addi	r3,r1,STACK_FRAME_OVERHEAD	bl	.unrecoverable_exception	b	1b#endif /* __DISABLED__ *//* * r13 points to the PACA, r9 contains the saved CR, * r12 contain the saved SRR1, SRR0 is still ready for return * r3 has the faulting address * r9 - r13 are saved in paca->exslb. * r3 is saved in paca->slb_r3 * We assume we aren't going to take any exceptions during this procedure. */_GLOBAL(slb_miss_realmode)	mflr	r10	stw	r9,PACA_EXSLB+EX_CCR(r13)	/* save CR in exc. frame */	std	r10,PACA_EXSLB+EX_LR(r13)	/* save LR */	bl	.slb_allocate_realmode	/* All done -- return from exception. */	ld	r10,PACA_EXSLB+EX_LR(r13)	ld	r3,PACA_EXSLB+EX_R3(r13)	lwz	r9,PACA_EXSLB+EX_CCR(r13)	/* get saved CR */#ifdef CONFIG_PPC_ISERIES	ld	r11,PACALPPACA+LPPACASRR0(r13)	/* get SRR0 value */#endif /* CONFIG_PPC_ISERIES */	mtlr	r10	andi.	r10,r12,MSR_RI	/* check for unrecoverable exception */	beq-	unrecov_slb.machine	push.machine	"power4"	mtcrf	0x80,r9	mtcrf	0x01,r9		/* slb_allocate uses cr0 and cr7 */.machine	pop#ifdef CONFIG_PPC_ISERIES	mtspr	SPRN_SRR0,r11	mtspr	SPRN_SRR1,r12#endif /* CONFIG_PPC_ISERIES */	ld	r9,PACA_EXSLB+EX_R9(r13)	ld	r10,PACA_EXSLB+EX_R10(r13)	ld	r11,PACA_EXSLB+EX_R11(r13)	ld	r12,PACA_EXSLB+EX_R12(r13)	ld	r13,PACA_EXSLB+EX_R13(r13)	rfid	b	.	/* prevent speculative execution */unrecov_slb:	EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)	DISABLE_INTS	bl	.save_nvgprs1:	addi	r3,r1,STACK_FRAME_OVERHEAD

⌨️ 快捷键说明

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