ivt.s

来自「xen虚拟机源代码安装包」· S 代码 · 共 873 行 · 第 1/2 页

S
873
字号
	add	r2=TF_GREG16,r14	add	r3=TF_GREG17,r14	;;	FILL_REG_PAIR(r16,r17,r2,r3)	FILL_REG_PAIR(r18,r19,r2,r3)	FILL_REG_PAIR(r20,r21,r2,r3)	FILL_REG_PAIR(r22,r23,r2,r3)	FILL_REG_PAIR(r24,r25,r2,r3)	FILL_REG_PAIR(r26,r27,r2,r3)	FILL_REG_PAIR(r28,r29,r2,r3)	FILL_REG_PAIR(r30,r31,r2,r3)	/*	 * On XEN I have to store the bank 1 register into the	 * global XSI_... area.	 */		// r16-r31 all now hold bank1 values	movl r2=XSI_BANK1_R16	movl r3=XSI_BANK1_R16+8	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r16=r16,@rev; mux1 r17=r17,@rev;;#endif	.mem.offset 0,0; st8.spill [r2]=r16,16	.mem.offset 8,0; st8.spill [r3]=r17,16	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r18=r18,@rev; mux1 r19=r19,@rev;;#endif	.mem.offset 0,0; st8.spill [r2]=r18,16	.mem.offset 8,0; st8.spill [r3]=r19,16	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r20=r20,@rev; mux1 r21=r21,@rev;;#endif	.mem.offset 0,0; st8.spill [r2]=r20,16	.mem.offset 8,0; st8.spill [r3]=r21,16	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r22=r22,@rev; mux1 r23=r23,@rev;;#endif	.mem.offset 0,0; st8.spill [r2]=r22,16	.mem.offset 8,0; st8.spill [r3]=r23,16	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r24=r24,@rev; mux1 r25=r25,@rev;;#endif	.mem.offset 0,0; st8.spill [r2]=r24,16	.mem.offset 8,0; st8.spill [r3]=r25,16	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r26=r26,@rev; mux1 r27=r27,@rev;;#endif	.mem.offset 0,0; st8.spill [r2]=r26,16	.mem.offset 8,0; st8.spill [r3]=r27,16	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r28=r28,@rev; mux1 r29=r29,@rev;;#endif	.mem.offset 0,0; st8.spill [r2]=r28,16	.mem.offset 8,0; st8.spill [r3]=r29,16	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r30=r30,@rev; mux1 r31=r31,@rev;;#endif	.mem.offset 0,0; st8.spill [r2]=r30,16	.mem.offset 8,0; st8.spill [r3]=r31,16	;;	// bsw.0	movl r2=XSI_BANKNUM;;	st4 [r2]=r0;	mov	r18=r14			// Move back the context pointer	;;	add	r19=TF_GREG2,r18	add	r20=TF_GREG3,r18	;;	FILL_REG_PAIR( r2, r3,r19,r20)	FILL_REG_PAIR( r8, r9,r19,r20)	FILL_REG_PAIR(r10,r11,r19,r20)	FILL_REG_PAIR(r14,r15,r19,r20)	//// r18 - trap frame base, 	add	r19=TF_CCV,r18	add	r20=TF_CSD,r18	;;	ld8	r21=[r19]		// ar.ccv	ld8	r22=[r20]		// ar.csd	;;	mov	ar.ccv=r21	mov	ar.csd=r22	add	r19=TF_SSD,r18	;;	ld8	r21=[r19]		// ar.ssd	;;	mov	ar.ssd=r21	add	r19=TF_FREG6,r18	add	r20=TF_FREG7,r18	;;	FILL_FP_PAIR(f6, f7, r19, r20)	FILL_FP_PAIR(f8, f9, r19, r20)	FILL_FP_PAIR(f10, f11, r19, r20)	add	r19=TF_FPSR,r18	;;	ld8	r21=[r19]		// ar.fpsr	;;	mov	ar.fpsr=r21	add	r19=TF_UNAT,r18	;;	ld8	r21=[r19]	;;	mov	ar.unat=r21	;;	srlz.i	;;	//rfi	XEN_HYPER_RFI;	;;END(restore_tf_rse_switch)ENTRY(save_special_regs)	alloc	loc0=ar.pfs,1,7,0,0	movl	loc1=XSI_IFA		// XEN !!	movl	loc2=XSI_ISR		// XEN !!	;;	ld8	loc3=[loc1],XSI_IIM_OFS-XSI_IFA_OFS	// load XEN.ifa	ld8	loc4=[loc2],XSI_IIPA_OFS-XSI_ISR_OFS	// load XEN.isr	add	loc5=TF_IFA,in0	add	loc6=TF_ISR,in0	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	loc3=loc3,@rev; mux1 loc4=loc4,@rev;;#endif	st8	[loc5]=loc3,TF_IIM-TF_IFA	// store cr.ifa	st8	[loc6]=loc4			// store cr.isr	;;	ld8	loc3=[loc1]			// load XEN.iim	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	loc3=loc3,@rev;;#endif	st8	[loc5]=loc3			// store cr.iim	;;	mov	ar.pfs=loc0	;;	br.ret.sptk.few rpEND(save_special_regs)ENTRY(hypervisor_callback)	/*	 * Use the thread stack here for storing the trap frame.	 * It's not wired mapped, so nested data tlb faults may occur!	 */	add	r18=-TF_SIZE,sp	;;{	.mib	nop	0x02	mov	r16=ip		// for jump back from save_tf_rse_switch	br.sptk	save_tf_rse_switch	;;}	add	sp=-16,r18		// the new stack	alloc	r15=ar.pfs,0,0,1,0	// 1 out for do_hypervisor_callback	;;	mov	out0=r18		// the trap frame	movl	r22=XSI_PSR_IC	mov	r23=1;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r23=r23,@rev;;#endif	st8	[r22]=r23		// ssm psr.ic	;;	br.call.sptk.few rp = do_hypervisor_callback	movl	r22=XSI_PSR_IC	;;	st4	[r22]=r0		// rsm psr.ic	add	r18=16,sp		// load EF-pointer again	;;			// must have r18-efp, calls rfi at the end.	br.sptk	restore_tf_rse_switch	;;END(hypervisor_callback)	/*	 * In: r30 - trap number	 */ENTRY(trap_error)		// Calculate the stack address for storing.	add	r18=-TF_SIZE,sp	;;	add	r20=TF_TRAP_NUM,r18	;;	st2	[r20]=r30	// save trap number	;;{	.mib	nop	0x02	mov	r16=ip		// for jumping back from save_tf_rse_switch		// Used register: r16, r18, r19, r20, r21, r22 of bank 0	br.sptk	save_tf_rse_switch	;;}	alloc	r15=ar.pfs,0,0,1,0	// 1 out for do_trap_error	;;	mov	out0=r18		// the trap frame	add	sp=-16,r18		// C-call abi	;;	movl r30=XSI_BANKNUM		// bsw.1	mov r31=1;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r31=r31,@rev;;#endif	st4 [r30]=r31;;		/* Save extra interrupt registers to the trap frame. */	br.call.sptk.few rp = save_special_regs	;;	movl	r22=XSI_PSR_IC	movl	r23=XSI_PSR_I_ADDR	;;	ld8	r23=[r23]	mov	r25=1	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r25=r25,@rev; mux1 r23=r23,@rev;;#endif	st4	[r22]=r25		// ssm psr.ic	st1	[r23]=r0		// ssm psr.i	;;	br.call.sptk.few rp = do_trap_error	;;		// --> currently not reached!!!	movl r23=XSI_PSR_I_ADDR	movl r22=XSI_PSR_IC	;;	ld8 r23=[r23]	mov r25=1	;;#if defined(BIG_ENDIAN)			// swap because mini-os is in BE	mux1	r25=r25,@rev;;	mux1	r25=r25,@rev; mux1 r23=r23,@rev;;#endif	st1 [r23]=r25	st4 [r22]=r0            // note: clears both vpsr.i and vpsr.ic!	;;	bsw.0	;;	add	r18=16,sp		// load EF-pointer again	;;	mov	sp=r18			// must have r18-efp, calls rfi at the end.	br.sptk	restore_tf_rse_switch	;;END(trap_error)/* * The trap handler stuff. */#define TRAP_ERR(num)			\	mov	r30 = num;		\	;;		;		\	br.sptk	trap_error		\	;;#define	IVT_ENTRY(name, offset)			\	.org	ia64_trap_table + offset;	\	.global	hivt_##name;			\	.proc	hivt_##name;			\	.prologue;				\	.body;					\hivt_##name:#define	IVT_END(name)				\	.endp	hivt_##name;			\	.align	0x100#define IVT_ERR(name, num, offset)		\	IVT_ENTRY(name, offset);		\	TRAP_ERR(num);				\	IVT_END(name)/* * The IA64 Interrupt Vector Table (IVT) contains 20 slots with 64 * bundles per vector and 48 slots with 16 bundles per vector. */	.section .text.hivt,"ax"	.align	32768	.global ia64_trap_table	.size	ia64_trap_table, 32768ia64_trap_table:IVT_ERR(VHPT_Translation, 0, 0x0)IVT_ERR(Instruction_TLB, 1, 0x0400)IVT_ERR(Data_TLB, 2, 0x0800)IVT_ERR(Alternate_Instruction_TLB, 3, 0x0c00)IVT_ENTRY(Alternate_Data_TLB, 0x1000)	mov	r30=4			// trap numberadt_common:	mov	r16=cr.ifa		// where did it happen	mov	r31=pr			// save predicates	;;	extr.u	r17=r16,IA64_RR_IDX_POS,3	// get region number	;;	cmp.eq	p14,p15=7,r17	;;//(p14)	br.sptk adt_regf_addr		// Check for region 7 - phys addresses//	;;//	br.sptk	trap_error//		// No return////adt_regf_addr://	extr.u	r17=r16,60,4		// get region number//	;;//	cmp.eq	p14,p15=0xf,r17//	;;(p14)	br.sptk adt_reg7_addr		// Check for region 7 - phys addresses	;;	br.sptk	trap_erroradt_reg7_addr:	/*	 * region 7 addresses are only directly mapped physically	 * addresses. Currently I don't do a check.	 */	movl	r20=~((7 << IA64_RR_IDX_POS) | 0xfff)	movl	r18=((PTE_PS_16K<<IA64_ITIR_PS)|(IA64_KEY_REG7<<IA64_ITIR_KEY))	;;	movl	r19=	((1<<PTE_OFF_P) | (PTE_MA_WB<<PTE_OFF_MA) | \			 (1<<PTE_OFF_A) | (1<<PTE_OFF_D) | \			 (PTE_PL_KERN<<PTE_OFF_PL) | (PTE_AR_RW<<PTE_OFF_AR))			// clear the region bits and 0-11			// extract the pfn from the ifa	mov	cr.itir=r18	and	r20=r20, r16	;;	or	r20=r20,r19		// put pfn into pte	;;	mov	pr=r31,-1		// restore predicates	itc.d	r20	;;	XEN_HYPER_RFI;	;;IVT_END(Alternate_Data_TLB)/* * Handling of nested data tlb is needed, because in hypervisor_callback() * the stack is used to store the register trap frame. This stack is allocated * dynamically (as identity mapped address) and therewidth no tr mapped page! */IVT_ENTRY(Data_Nested_TLB, 0x1400)	mov	r30=5			// trap number	add	r28=-TF_SIZE,sp		// r28 is never used in trap handling	;;	mov	cr.ifa=r28	;;	br.sptk	adt_commonIVT_END(Data_Nested_TLB)IVT_ERR(Instruction_Key_Miss, 6, 0x1800)IVT_ERR(Data_Key_Miss, 7, 0x1c00)IVT_ERR(Dirty_Bit, 8, 0x2000)IVT_ERR(Instruction_Access_Bit, 9, 0x2400)IVT_ERR(Data_Access_Bit, 10, 0x2800)IVT_ERR(Break_Instruction, 11, 0x2c00)IVT_ERR(External_Interrupt, 12, 0x3000)IVT_ERR(Reserved_3400, 13, 0x3400)IVT_ERR(Reserved_3800, 14, 0x3800)IVT_ERR(Reserved_3c00, 15, 0x3c00)IVT_ERR(Reserved_4000, 16, 0x4000)IVT_ERR(Reserved_4400, 17, 0x4400)IVT_ERR(Reserved_4800, 18, 0x4800)IVT_ERR(Reserved_4c00, 19, 0x4c00)IVT_ERR(Page_Not_Present, 20, 0x5000)IVT_ERR(Key_Permission, 21, 0x5100)IVT_ERR(Instruction_Access_Rights, 22, 0x5200)IVT_ERR(Data_Access_Rights, 23, 0x5300)IVT_ERR(General_Exception, 24, 0x5400)IVT_ERR(Disabled_FP_Register, 25, 0x5500)IVT_ERR(NaT_Consumption, 26, 0x5600)IVT_ERR(Speculation, 27, 0x5700)IVT_ERR(Reserved_5800, 28, 0x5800)IVT_ERR(Debug, 29, 0x5900)IVT_ERR(Unaligned_Reference, 30, 0x5a00)IVT_ERR(Unsupported_Data_Reference, 31, 0x5b00)IVT_ERR(Floating_Point_Fault, 32, 0x5c00)IVT_ERR(Floating_Point_Trap, 33, 0x5d00)IVT_ERR(Lower_Privilege_Transfer_Trap, 34, 0x5e00)IVT_ERR(Taken_Branch_Trap, 35, 0x5f00)IVT_ERR(Single_Step_Trap, 36, 0x6000)IVT_ERR(Reserved_6100, 37, 0x6100)IVT_ERR(Reserved_6200, 38, 0x6200)IVT_ERR(Reserved_6300, 39, 0x6300)IVT_ERR(Reserved_6400, 40, 0x6400)IVT_ERR(Reserved_6500, 41, 0x6500)IVT_ERR(Reserved_6600, 42, 0x6600)IVT_ERR(Reserved_6700, 43, 0x6700)IVT_ERR(Reserved_6800, 44, 0x6800)IVT_ERR(IA_32_Exception, 45, 0x6900)IVT_ERR(IA_32_Intercept, 46, 0x6a00)IVT_ERR(IA_32_Interrupt, 47, 0x6b00)IVT_ERR(Reserved_6c00, 48, 0x6c00)IVT_ERR(Reserved_6d00, 49, 0x6d00)IVT_ERR(Reserved_6e00, 50, 0x6e00)IVT_ERR(Reserved_6f00, 51, 0x6f00)IVT_ERR(Reserved_7000, 52, 0x7000)IVT_ERR(Reserved_7100, 53, 0x7100)IVT_ERR(Reserved_7200, 54, 0x7200)IVT_ERR(Reserved_7300, 55, 0x7300)IVT_ERR(Reserved_7400, 56, 0x7400)IVT_ERR(Reserved_7500, 57, 0x7500)IVT_ERR(Reserved_7600, 58, 0x7600)IVT_ERR(Reserved_7700, 59, 0x7700)IVT_ERR(Reserved_7800, 60, 0x7800)IVT_ERR(Reserved_7900, 61, 0x7900)IVT_ERR(Reserved_7a00, 62, 0x7a00)IVT_ERR(Reserved_7b00, 63, 0x7b00)IVT_ERR(Reserved_7c00, 64, 0x7c00)IVT_ERR(Reserved_7d00, 65, 0x7d00)IVT_ERR(Reserved_7e00, 66, 0x7e00)IVT_ERR(Reserved_7f00, 67, 0x7f00)

⌨️ 快捷键说明

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