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

📄 entry.s

📁 linux 内核源代码
💻 S
📖 第 1 页 / 共 3 页
字号:
mcck_int_handler:	spt	__LC_CPU_TIMER_SAVE_AREA	# revalidate cpu timer	lm	%r0,%r15,__LC_GPREGS_SAVE_AREA	# revalidate gprs	SAVE_ALL_BASE __LC_SAVE_AREA+32	la	%r12,__LC_MCK_OLD_PSW	tm	__LC_MCCK_CODE,0x80	# system damage?	bo	BASED(mcck_int_main)	# yes -> rest of mcck code invalid#ifdef CONFIG_VIRT_CPU_ACCOUNTING	mvc	__LC_SAVE_AREA+52(8),__LC_ASYNC_ENTER_TIMER	mvc	__LC_ASYNC_ENTER_TIMER(8),__LC_CPU_TIMER_SAVE_AREA	tm	__LC_MCCK_CODE+5,0x02	# stored cpu timer value valid?	bo	BASED(1f)	la	%r14,__LC_SYNC_ENTER_TIMER	clc	0(8,%r14),__LC_ASYNC_ENTER_TIMER	bl	BASED(0f)	la	%r14,__LC_ASYNC_ENTER_TIMER0:	clc	0(8,%r14),__LC_EXIT_TIMER	bl	BASED(0f)	la	%r14,__LC_EXIT_TIMER0:	clc	0(8,%r14),__LC_LAST_UPDATE_TIMER	bl	BASED(0f)	la	%r14,__LC_LAST_UPDATE_TIMER0:	spt	0(%r14)	mvc	__LC_ASYNC_ENTER_TIMER(8),0(%r14)1:#endif	tm	__LC_MCCK_CODE+2,0x09	# mwp + ia of old psw valid?	bno	BASED(mcck_int_main)	# no -> skip cleanup critical	tm	__LC_MCK_OLD_PSW+1,0x01	# test problem state bit	bnz	BASED(mcck_int_main)	# from user -> load async stack	clc	__LC_MCK_OLD_PSW+4(4),BASED(.Lcritical_end)	bhe	BASED(mcck_int_main)	clc	__LC_MCK_OLD_PSW+4(4),BASED(.Lcritical_start)	bl	BASED(mcck_int_main)	l	%r14,BASED(.Lcleanup_critical)	basr	%r14,%r14mcck_int_main:	l	%r14,__LC_PANIC_STACK	# are we already on the panic stack?	slr	%r14,%r15	sra	%r14,PAGE_SHIFT	be	BASED(0f)	l	%r15,__LC_PANIC_STACK	# load panic stack0:	CREATE_STACK_FRAME __LC_MCK_OLD_PSW,__LC_SAVE_AREA+32#ifdef CONFIG_VIRT_CPU_ACCOUNTING	tm	__LC_MCCK_CODE+2,0x08	# mwp of old psw valid?	bno	BASED(mcck_no_vtime)	# no -> skip cleanup critical	tm	SP_PSW+1(%r15),0x01	# interrupting from user ?	bz	BASED(mcck_no_vtime)	UPDATE_VTIME __LC_EXIT_TIMER,__LC_ASYNC_ENTER_TIMER,__LC_USER_TIMER	UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER	mvc	__LC_LAST_UPDATE_TIMER(8),__LC_ASYNC_ENTER_TIMERmcck_no_vtime:#endif	l	%r9,__LC_THREAD_INFO	# load pointer to thread_info struct	la	%r2,SP_PTREGS(%r15)	# load pt_regs	l	%r1,BASED(.Ls390_mcck)	basr	%r14,%r1		# call machine check handler	tm	SP_PSW+1(%r15),0x01	# returning to user ?	bno	BASED(mcck_return)	l	%r1,__LC_KERNEL_STACK	# switch to kernel stack	s	%r1,BASED(.Lc_spsize)	mvc	SP_PTREGS(__PT_SIZE,%r1),SP_PTREGS(%r15)	xc	__SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1) # clear back chain	lr	%r15,%r1	stosm	__SF_EMPTY(%r15),0x04	# turn dat on	tm	__TI_flags+3(%r9),_TIF_MCCK_PENDING	bno	BASED(mcck_return)	TRACE_IRQS_OFF	l	%r1,BASED(.Ls390_handle_mcck)	basr	%r14,%r1		# call machine check handler	TRACE_IRQS_ONmcck_return:	mvc	__LC_RETURN_MCCK_PSW(8),SP_PSW(%r15) # move return PSW	ni	__LC_RETURN_MCCK_PSW+1,0xfd # clear wait state bit#ifdef CONFIG_VIRT_CPU_ACCOUNTING	mvc	__LC_ASYNC_ENTER_TIMER(8),__LC_SAVE_AREA+52	tm	__LC_RETURN_MCCK_PSW+1,0x01 # returning to user ?	bno	BASED(0f)	lm	%r0,%r15,SP_R0(%r15)	# load gprs 0-15	stpt	__LC_EXIT_TIMER	lpsw	__LC_RETURN_MCCK_PSW	# back to caller0:#endif	lm	%r0,%r15,SP_R0(%r15)	# load gprs 0-15	lpsw	__LC_RETURN_MCCK_PSW	# back to caller	RESTORE_ALL __LC_RETURN_MCCK_PSW,0/* * Restart interruption handler, kick starter for additional CPUs */#ifdef CONFIG_SMP#ifndef CONFIG_HOTPLUG_CPU	.section .init.text,"ax"#endif	.globl restart_int_handlerrestart_int_handler:	l	%r15,__LC_SAVE_AREA+60	# load ksp	lctl	%c0,%c15,__LC_CREGS_SAVE_AREA # get new ctl regs	lam	%a0,%a15,__LC_AREGS_SAVE_AREA	lm	%r6,%r15,__SF_GPRS(%r15) # load registers from clone	stosm	__SF_EMPTY(%r15),0x04	# now we can turn dat on	basr	%r14,0	l	%r14,restart_addr-.(%r14)	br	%r14			# branch to start_secondaryrestart_addr:	.long	start_secondary#ifndef CONFIG_HOTPLUG_CPU	.previous#endif#else/* * If we do not run with SMP enabled, let the new CPU crash ... */	.globl restart_int_handlerrestart_int_handler:	basr	%r1,0restart_base:	lpsw	restart_crash-restart_base(%r1)	.align	8restart_crash:	.long	0x000a0000,0x00000000restart_go:#endif#ifdef CONFIG_CHECK_STACK/* * The synchronous or the asynchronous stack overflowed. We are dead. * No need to properly save the registers, we are going to panic anyway. * Setup a pt_regs so that show_trace can provide a good call trace. */stack_overflow:	l	%r15,__LC_PANIC_STACK	# change to panic stack	sl	%r15,BASED(.Lc_spsize)	mvc	SP_PSW(8,%r15),0(%r12)	# move user PSW to stack	stm	%r0,%r11,SP_R0(%r15)	# store gprs %r0-%r11 to kernel stack	la	%r1,__LC_SAVE_AREA	ch	%r12,BASED(.L0x020)	# old psw addr == __LC_SVC_OLD_PSW ?	be	BASED(0f)	ch	%r12,BASED(.L0x028)	# old psw addr == __LC_PGM_OLD_PSW ?	be	BASED(0f)	la	%r1,__LC_SAVE_AREA+160:	mvc	SP_R12(16,%r15),0(%r1)	# move %r12-%r15 to stack	xc	__SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear back chain	l	%r1,BASED(1f)		# branch to kernel_stack_overflow	la	%r2,SP_PTREGS(%r15)	# load pt_regs	br	%r11:	.long	kernel_stack_overflow#endifcleanup_table_system_call:	.long	system_call + 0x80000000, sysc_do_svc + 0x80000000cleanup_table_sysc_return:	.long	sysc_return + 0x80000000, sysc_leave + 0x80000000cleanup_table_sysc_leave:	.long	sysc_leave + 0x80000000, sysc_done + 0x80000000cleanup_table_sysc_work_loop:	.long	sysc_work_loop + 0x80000000, sysc_work_done + 0x80000000cleanup_table_io_return:	.long	io_return + 0x80000000, io_leave + 0x80000000cleanup_table_io_leave:	.long	io_leave + 0x80000000, io_done + 0x80000000cleanup_table_io_work_loop:	.long	io_work_loop + 0x80000000, io_work_done + 0x80000000cleanup_critical:	clc	4(4,%r12),BASED(cleanup_table_system_call)	bl	BASED(0f)	clc	4(4,%r12),BASED(cleanup_table_system_call+4)	bl	BASED(cleanup_system_call)0:	clc	4(4,%r12),BASED(cleanup_table_sysc_return)	bl	BASED(0f)	clc	4(4,%r12),BASED(cleanup_table_sysc_return+4)	bl	BASED(cleanup_sysc_return)0:	clc	4(4,%r12),BASED(cleanup_table_sysc_leave)	bl	BASED(0f)	clc	4(4,%r12),BASED(cleanup_table_sysc_leave+4)	bl	BASED(cleanup_sysc_leave)0:	clc	4(4,%r12),BASED(cleanup_table_sysc_work_loop)	bl	BASED(0f)	clc	4(4,%r12),BASED(cleanup_table_sysc_work_loop+4)	bl	BASED(cleanup_sysc_return)0:	clc	4(4,%r12),BASED(cleanup_table_io_return)	bl	BASED(0f)	clc	4(4,%r12),BASED(cleanup_table_io_return+4)	bl	BASED(cleanup_io_return)0:	clc	4(4,%r12),BASED(cleanup_table_io_leave)	bl	BASED(0f)	clc	4(4,%r12),BASED(cleanup_table_io_leave+4)	bl	BASED(cleanup_io_leave)0:	clc	4(4,%r12),BASED(cleanup_table_io_work_loop)	bl	BASED(0f)	clc	4(4,%r12),BASED(cleanup_table_io_work_loop+4)	bl	BASED(cleanup_io_return)0:	br	%r14cleanup_system_call:	mvc	__LC_RETURN_PSW(8),0(%r12)	c	%r12,BASED(.Lmck_old_psw)	be	BASED(0f)	la	%r12,__LC_SAVE_AREA+16	b	BASED(1f)0:	la	%r12,__LC_SAVE_AREA+321:#ifdef CONFIG_VIRT_CPU_ACCOUNTING	clc	__LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn+4)	bh	BASED(0f)	mvc	__LC_SYNC_ENTER_TIMER(8),__LC_ASYNC_ENTER_TIMER0:	clc	__LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn+8)	bhe	BASED(cleanup_vtime)#endif	clc	__LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn)	bh	BASED(0f)	mvc	__LC_SAVE_AREA(16),0(%r12)0:	st	%r13,4(%r12)	st	%r12,__LC_SAVE_AREA+48	# argh	SAVE_ALL_SYNC __LC_SVC_OLD_PSW,__LC_SAVE_AREA	CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA	l	%r12,__LC_SAVE_AREA+48	# argh	st	%r15,12(%r12)	lh	%r7,0x8a#ifdef CONFIG_VIRT_CPU_ACCOUNTINGcleanup_vtime:	clc	__LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn+12)	bhe	BASED(cleanup_stime)	UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMERcleanup_stime:	clc	__LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn+16)	bh	BASED(cleanup_update)	UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMERcleanup_update:	mvc	__LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER#endif	mvc	__LC_RETURN_PSW+4(4),BASED(cleanup_table_system_call+4)	la	%r12,__LC_RETURN_PSW	br	%r14cleanup_system_call_insn:	.long	sysc_saveall + 0x80000000#ifdef CONFIG_VIRT_CPU_ACCOUNTING	.long	system_call + 0x80000000	.long	sysc_vtime + 0x80000000	.long	sysc_stime + 0x80000000	.long	sysc_update + 0x80000000#endifcleanup_sysc_return:	mvc	__LC_RETURN_PSW(4),0(%r12)	mvc	__LC_RETURN_PSW+4(4),BASED(cleanup_table_sysc_return)	la	%r12,__LC_RETURN_PSW	br	%r14cleanup_sysc_leave:	clc	4(4,%r12),BASED(cleanup_sysc_leave_insn)	be	BASED(2f)#ifdef CONFIG_VIRT_CPU_ACCOUNTING	mvc	__LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER	clc	4(4,%r12),BASED(cleanup_sysc_leave_insn+4)	be	BASED(2f)#endif	mvc	__LC_RETURN_PSW(8),SP_PSW(%r15)	c	%r12,BASED(.Lmck_old_psw)	bne	BASED(0f)	mvc	__LC_SAVE_AREA+32(16),SP_R12(%r15)	b	BASED(1f)0:	mvc	__LC_SAVE_AREA+16(16),SP_R12(%r15)1:	lm	%r0,%r11,SP_R0(%r15)	l	%r15,SP_R15(%r15)2:	la	%r12,__LC_RETURN_PSW	br	%r14cleanup_sysc_leave_insn:	.long	sysc_done - 4 + 0x80000000#ifdef CONFIG_VIRT_CPU_ACCOUNTING	.long	sysc_done - 8 + 0x80000000#endifcleanup_io_return:	mvc	__LC_RETURN_PSW(4),0(%r12)	mvc	__LC_RETURN_PSW+4(4),BASED(cleanup_table_io_work_loop)	la	%r12,__LC_RETURN_PSW	br	%r14cleanup_io_leave:	clc	4(4,%r12),BASED(cleanup_io_leave_insn)	be	BASED(2f)#ifdef CONFIG_VIRT_CPU_ACCOUNTING	mvc	__LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER	clc	4(4,%r12),BASED(cleanup_io_leave_insn+4)	be	BASED(2f)#endif	mvc	__LC_RETURN_PSW(8),SP_PSW(%r15)	c	%r12,BASED(.Lmck_old_psw)	bne	BASED(0f)	mvc	__LC_SAVE_AREA+32(16),SP_R12(%r15)	b	BASED(1f)0:	mvc	__LC_SAVE_AREA+16(16),SP_R12(%r15)1:	lm	%r0,%r11,SP_R0(%r15)	l	%r15,SP_R15(%r15)2:	la	%r12,__LC_RETURN_PSW	br	%r14cleanup_io_leave_insn:	.long	io_done - 4 + 0x80000000#ifdef CONFIG_VIRT_CPU_ACCOUNTING	.long	io_done - 8 + 0x80000000#endif/* * Integer constants */		.align	4.Lc_spsize:	.long	SP_SIZE.Lc_overhead:	.long	STACK_FRAME_OVERHEAD.Lnr_syscalls:	.long	NR_syscalls.L0x018:	.short	0x018.L0x020:	.short	0x020.L0x028:	.short	0x028.L0x030:	.short	0x030.L0x038:	.short	0x038.Lc_1:		.long	1/* * Symbol constants */.Ls390_mcck:	.long	s390_do_machine_check.Ls390_handle_mcck:		.long	s390_handle_mcck.Lmck_old_psw:	.long	__LC_MCK_OLD_PSW.Ldo_IRQ:	.long	do_IRQ.Ldo_extint:	.long	do_extint.Ldo_signal:	.long	do_signal.Lhandle_per:	.long	do_single_step.Ldo_execve:	.long	do_execve.Lexecve_tail:	.long	execve_tail.Ljump_table:	.long	pgm_check_table.Lschedule:	.long	schedule#ifdef CONFIG_PREEMPT.Lpreempt_schedule_irq:		.long	preempt_schedule_irq#endif.Ltrace:	.long	syscall_trace.Lschedtail:	.long	schedule_tail.Lsysc_table:	.long	sys_call_table#ifdef CONFIG_TRACE_IRQFLAGS.Ltrace_irq_on: .long	trace_hardirqs_on.Ltrace_irq_off:		.long	trace_hardirqs_off.Llockdep_sys_exit:		.long	lockdep_sys_exit#endif.Lcritical_start:		.long	__critical_start + 0x80000000.Lcritical_end:		.long	__critical_end + 0x80000000.Lcleanup_critical:		.long	cleanup_critical		.section .rodata, "a"#define SYSCALL(esa,esame,emu)	.long esasys_call_table:#include "syscalls.S"#undef SYSCALL

⌨️ 快捷键说明

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