1531 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			1531 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* entry.S: FR-V entry
 | |
|  *
 | |
|  * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
 | |
|  * Written by David Howells (dhowells@redhat.com)
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License
 | |
|  * as published by the Free Software Foundation; either version
 | |
|  * 2 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  *
 | |
|  * Entry to the kernel is "interesting":
 | |
|  *  (1) There are no stack pointers, not even for the kernel
 | |
|  *  (2) General Registers should not be clobbered
 | |
|  *  (3) There are no kernel-only data registers
 | |
|  *  (4) Since all addressing modes are wrt to a General Register, no global
 | |
|  *      variables can be reached
 | |
|  *
 | |
|  * We deal with this by declaring that we shall kill GR28 on entering the
 | |
|  * kernel from userspace
 | |
|  *
 | |
|  * However, since break interrupts can interrupt the CPU even when PSR.ET==0,
 | |
|  * they can't rely on GR28 to be anything useful, and so need to clobber a
 | |
|  * separate register (GR31). Break interrupts are managed in break.S
 | |
|  *
 | |
|  * GR29 _is_ saved, and holds the current task pointer globally
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <linux/linkage.h>
 | |
| #include <asm/thread_info.h>
 | |
| #include <asm/setup.h>
 | |
| #include <asm/segment.h>
 | |
| #include <asm/ptrace.h>
 | |
| #include <asm/errno.h>
 | |
| #include <asm/cache.h>
 | |
| #include <asm/spr-regs.h>
 | |
| 
 | |
| #define nr_syscalls ((syscall_table_size)/4)
 | |
| 
 | |
| 	.section	.text.entry
 | |
| 	.balign		4
 | |
| 
 | |
| .macro LEDS val
 | |
| #	sethi.p		%hi(0xe1200004),gr30
 | |
| #	setlo		%lo(0xe1200004),gr30
 | |
| #	setlos		#~\val,gr31
 | |
| #	st		gr31,@(gr30,gr0)
 | |
| #	sethi.p		%hi(0xffc00100),gr30
 | |
| #	setlo		%lo(0xffc00100),gr30
 | |
| #	sth		gr0,@(gr30,gr0)
 | |
| #	membar
 | |
| .endm
 | |
| 
 | |
| .macro LEDS32
 | |
| #	not		gr31,gr31
 | |
| #	sethi.p		%hi(0xe1200004),gr30
 | |
| #	setlo		%lo(0xe1200004),gr30
 | |
| #	st.p		gr31,@(gr30,gr0)
 | |
| #	srli		gr31,#16,gr31
 | |
| #	sethi.p		%hi(0xffc00100),gr30
 | |
| #	setlo		%lo(0xffc00100),gr30
 | |
| #	sth		gr31,@(gr30,gr0)
 | |
| #	membar
 | |
| .endm
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # entry point for External interrupts received whilst executing userspace code
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_uspace_external_interrupt
 | |
|         .type		__entry_uspace_external_interrupt,@function
 | |
| __entry_uspace_external_interrupt:
 | |
| 	LEDS		0x6200
 | |
| 	sethi.p		%hi(__kernel_frame0_ptr),gr28
 | |
| 	setlo		%lo(__kernel_frame0_ptr),gr28
 | |
| 	ldi		@(gr28,#0),gr28
 | |
| 
 | |
| 	# handle h/w single-step through exceptions
 | |
| 	sti		gr0,@(gr28,#REG__STATUS)
 | |
| 
 | |
| 	.globl		__entry_uspace_external_interrupt_reentry
 | |
| __entry_uspace_external_interrupt_reentry:
 | |
| 	LEDS		0x6201
 | |
| 
 | |
| 	setlos		#REG__END,gr30
 | |
| 	dcpl		gr28,gr30,#0
 | |
| 
 | |
| 	# finish building the exception frame
 | |
| 	sti		sp,  @(gr28,#REG_SP)
 | |
| 	stdi		gr2, @(gr28,#REG_GR(2))
 | |
| 	stdi		gr4, @(gr28,#REG_GR(4))
 | |
| 	stdi		gr6, @(gr28,#REG_GR(6))
 | |
| 	stdi		gr8, @(gr28,#REG_GR(8))
 | |
| 	stdi		gr10,@(gr28,#REG_GR(10))
 | |
| 	stdi		gr12,@(gr28,#REG_GR(12))
 | |
| 	stdi		gr14,@(gr28,#REG_GR(14))
 | |
| 	stdi		gr16,@(gr28,#REG_GR(16))
 | |
| 	stdi		gr18,@(gr28,#REG_GR(18))
 | |
| 	stdi		gr20,@(gr28,#REG_GR(20))
 | |
| 	stdi		gr22,@(gr28,#REG_GR(22))
 | |
| 	stdi		gr24,@(gr28,#REG_GR(24))
 | |
| 	stdi		gr26,@(gr28,#REG_GR(26))
 | |
| 	sti		gr0, @(gr28,#REG_GR(28))
 | |
| 	sti		gr29,@(gr28,#REG_GR(29))
 | |
| 	stdi.p		gr30,@(gr28,#REG_GR(30))
 | |
| 
 | |
| 	# set up the kernel stack pointer
 | |
| 	ori		gr28,0,sp
 | |
| 
 | |
| 	movsg		tbr ,gr20
 | |
| 	movsg		psr ,gr22
 | |
| 	movsg		pcsr,gr21
 | |
| 	movsg		isr ,gr23
 | |
| 	movsg		ccr ,gr24
 | |
| 	movsg		cccr,gr25
 | |
| 	movsg		lr  ,gr26
 | |
| 	movsg		lcr ,gr27
 | |
| 
 | |
| 	setlos.p	#-1,gr4
 | |
| 	andi		gr22,#PSR_PS,gr5		/* try to rebuild original PSR value */
 | |
| 	andi.p		gr22,#~(PSR_PS|PSR_S),gr6
 | |
| 	slli		gr5,#1,gr5
 | |
| 	or		gr6,gr5,gr5
 | |
| 	andi		gr5,#~PSR_ET,gr5
 | |
| 
 | |
| 	sti		gr20,@(gr28,#REG_TBR)
 | |
| 	sti		gr21,@(gr28,#REG_PC)
 | |
| 	sti		gr5 ,@(gr28,#REG_PSR)
 | |
| 	sti		gr23,@(gr28,#REG_ISR)
 | |
| 	stdi		gr24,@(gr28,#REG_CCR)
 | |
| 	stdi		gr26,@(gr28,#REG_LR)
 | |
| 	sti		gr4 ,@(gr28,#REG_SYSCALLNO)
 | |
| 
 | |
| 	movsg		iacc0h,gr4
 | |
| 	movsg		iacc0l,gr5
 | |
| 	stdi		gr4,@(gr28,#REG_IACC0)
 | |
| 
 | |
| 	movsg		gner0,gr4
 | |
| 	movsg		gner1,gr5
 | |
| 	stdi.p		gr4,@(gr28,#REG_GNER0)
 | |
| 
 | |
| 	# interrupts start off fully disabled in the interrupt handler
 | |
| 	subcc		gr0,gr0,gr0,icc2		/* set Z and clear C */
 | |
| 
 | |
| 	# set up kernel global registers
 | |
| 	sethi.p		%hi(__kernel_current_task),gr5
 | |
| 	setlo		%lo(__kernel_current_task),gr5
 | |
| 	sethi.p		%hi(_gp),gr16
 | |
| 	setlo		%lo(_gp),gr16
 | |
| 	ldi		@(gr5,#0),gr29
 | |
| 	ldi.p		@(gr29,#4),gr15		; __current_thread_info = current->thread_info
 | |
| 
 | |
| 	# make sure we (the kernel) get div-zero and misalignment exceptions
 | |
| 	setlos		#ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
 | |
| 	movgs		gr5,isr
 | |
| 
 | |
| 	# switch to the kernel trap table
 | |
| 	sethi.p		%hi(__entry_kerneltrap_table),gr6
 | |
| 	setlo		%lo(__entry_kerneltrap_table),gr6
 | |
| 	movgs		gr6,tbr
 | |
| 
 | |
| 	# set the return address
 | |
| 	sethi.p		%hi(__entry_return_from_user_interrupt),gr4
 | |
| 	setlo		%lo(__entry_return_from_user_interrupt),gr4
 | |
| 	movgs		gr4,lr
 | |
| 
 | |
| 	# raise the minimum interrupt priority to 15 (NMI only) and enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 
 | |
| 	ori		gr4,#PSR_PIL_14,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	ori		gr4,#PSR_PIL_14|PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 
 | |
| 	LEDS		0x6202
 | |
| 	bra		do_IRQ
 | |
| 
 | |
| 	.size		__entry_uspace_external_interrupt,.-__entry_uspace_external_interrupt
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # entry point for External interrupts received whilst executing kernel code
 | |
| # - on arriving here, the following registers should already be set up:
 | |
| #	GR15	- current thread_info struct pointer
 | |
| #	GR16	- kernel GP-REL pointer
 | |
| #	GR29	- current task struct pointer
 | |
| #	TBR	- kernel trap vector table
 | |
| #	ISR	- kernel's preferred integer controls
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_kernel_external_interrupt
 | |
|         .type		__entry_kernel_external_interrupt,@function
 | |
| __entry_kernel_external_interrupt:
 | |
| 	LEDS		0x6210
 | |
| //	sub		sp,gr15,gr31
 | |
| //	LEDS32
 | |
| 
 | |
| 	# set up the stack pointer
 | |
| 	or.p		sp,gr0,gr30
 | |
| 	subi		sp,#REG__END,sp
 | |
| 	sti		gr30,@(sp,#REG_SP)
 | |
| 
 | |
| 	# handle h/w single-step through exceptions
 | |
| 	sti		gr0,@(sp,#REG__STATUS)
 | |
| 
 | |
| 	.globl		__entry_kernel_external_interrupt_reentry
 | |
| __entry_kernel_external_interrupt_reentry:
 | |
| 	LEDS		0x6211
 | |
| 
 | |
| 	# set up the exception frame
 | |
| 	setlos		#REG__END,gr30
 | |
| 	dcpl		sp,gr30,#0
 | |
| 
 | |
| 	sti.p		gr28,@(sp,#REG_GR(28))
 | |
| 	ori		sp,0,gr28
 | |
| 
 | |
| 	# finish building the exception frame
 | |
| 	stdi		gr2,@(gr28,#REG_GR(2))
 | |
| 	stdi		gr4,@(gr28,#REG_GR(4))
 | |
| 	stdi		gr6,@(gr28,#REG_GR(6))
 | |
| 	stdi		gr8,@(gr28,#REG_GR(8))
 | |
| 	stdi		gr10,@(gr28,#REG_GR(10))
 | |
| 	stdi		gr12,@(gr28,#REG_GR(12))
 | |
| 	stdi		gr14,@(gr28,#REG_GR(14))
 | |
| 	stdi		gr16,@(gr28,#REG_GR(16))
 | |
| 	stdi		gr18,@(gr28,#REG_GR(18))
 | |
| 	stdi		gr20,@(gr28,#REG_GR(20))
 | |
| 	stdi		gr22,@(gr28,#REG_GR(22))
 | |
| 	stdi		gr24,@(gr28,#REG_GR(24))
 | |
| 	stdi		gr26,@(gr28,#REG_GR(26))
 | |
| 	sti		gr29,@(gr28,#REG_GR(29))
 | |
| 	stdi.p		gr30,@(gr28,#REG_GR(30))
 | |
| 
 | |
| 	# note virtual interrupts will be fully enabled upon return
 | |
| 	subicc		gr0,#1,gr0,icc2			/* clear Z, set C */
 | |
| 
 | |
| 	movsg		tbr ,gr20
 | |
| 	movsg		psr ,gr22
 | |
| 	movsg		pcsr,gr21
 | |
| 	movsg		isr ,gr23
 | |
| 	movsg		ccr ,gr24
 | |
| 	movsg		cccr,gr25
 | |
| 	movsg		lr  ,gr26
 | |
| 	movsg		lcr ,gr27
 | |
| 
 | |
| 	setlos.p	#-1,gr4
 | |
| 	andi		gr22,#PSR_PS,gr5		/* try to rebuild original PSR value */
 | |
| 	andi.p		gr22,#~(PSR_PS|PSR_S),gr6
 | |
| 	slli		gr5,#1,gr5
 | |
| 	or		gr6,gr5,gr5
 | |
| 	andi.p		gr5,#~PSR_ET,gr5
 | |
| 
 | |
| 	# set CCCR.CC3 to Undefined to abort atomic-modify completion inside the kernel
 | |
| 	# - for an explanation of how it works, see: Documentation/frv/atomic-ops.txt
 | |
| 	andi		gr25,#~0xc0,gr25
 | |
| 
 | |
| 	sti		gr20,@(gr28,#REG_TBR)
 | |
| 	sti		gr21,@(gr28,#REG_PC)
 | |
| 	sti		gr5 ,@(gr28,#REG_PSR)
 | |
| 	sti		gr23,@(gr28,#REG_ISR)
 | |
| 	stdi		gr24,@(gr28,#REG_CCR)
 | |
| 	stdi		gr26,@(gr28,#REG_LR)
 | |
| 	sti		gr4 ,@(gr28,#REG_SYSCALLNO)
 | |
| 
 | |
| 	movsg		iacc0h,gr4
 | |
| 	movsg		iacc0l,gr5
 | |
| 	stdi		gr4,@(gr28,#REG_IACC0)
 | |
| 
 | |
| 	movsg		gner0,gr4
 | |
| 	movsg		gner1,gr5
 | |
| 	stdi.p		gr4,@(gr28,#REG_GNER0)
 | |
| 
 | |
| 	# interrupts start off fully disabled in the interrupt handler
 | |
| 	subcc		gr0,gr0,gr0,icc2			/* set Z and clear C */
 | |
| 
 | |
| 	# set the return address
 | |
| 	sethi.p		%hi(__entry_return_from_kernel_interrupt),gr4
 | |
| 	setlo		%lo(__entry_return_from_kernel_interrupt),gr4
 | |
| 	movgs		gr4,lr
 | |
| 
 | |
| 	# clear power-saving mode flags
 | |
| 	movsg		hsr0,gr4
 | |
| 	andi		gr4,#~HSR0_PDM,gr4
 | |
| 	movgs		gr4,hsr0
 | |
| 
 | |
| 	# raise the minimum interrupt priority to 15 (NMI only) and enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_PIL_14,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 
 | |
| 	LEDS		0x6212
 | |
| 	bra		do_IRQ
 | |
| 
 | |
| 	.size		__entry_kernel_external_interrupt,.-__entry_kernel_external_interrupt
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # deal with interrupts that were actually virtually disabled
 | |
| # - we need to really disable them, flag the fact and return immediately
 | |
| # - if you change this, you must alter break.S also
 | |
| #
 | |
| ###############################################################################
 | |
| 	.balign		L1_CACHE_BYTES
 | |
| 	.globl		__entry_kernel_external_interrupt_virtually_disabled
 | |
| 	.type		__entry_kernel_external_interrupt_virtually_disabled,@function
 | |
| __entry_kernel_external_interrupt_virtually_disabled:
 | |
| 	movsg		psr,gr30
 | |
| 	andi		gr30,#~PSR_PIL,gr30
 | |
| 	ori		gr30,#PSR_PIL_14,gr30		; debugging interrupts only
 | |
| 	movgs		gr30,psr
 | |
| 	subcc		gr0,gr0,gr0,icc2		; leave Z set, clear C
 | |
| 	rett		#0
 | |
| 
 | |
| 	.size		__entry_kernel_external_interrupt_virtually_disabled,.-__entry_kernel_external_interrupt_virtually_disabled
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # deal with re-enablement of interrupts that were pending when virtually re-enabled
 | |
| # - set ICC2.C, re-enable the real interrupts and return
 | |
| # - we can clear ICC2.Z because we shouldn't be here if it's not 0 [due to TIHI]
 | |
| # - if you change this, you must alter break.S also
 | |
| #
 | |
| ###############################################################################
 | |
| 	.balign		L1_CACHE_BYTES
 | |
| 	.globl		__entry_kernel_external_interrupt_virtual_reenable
 | |
| 	.type		__entry_kernel_external_interrupt_virtual_reenable,@function
 | |
| __entry_kernel_external_interrupt_virtual_reenable:
 | |
| 	movsg		psr,gr30
 | |
| 	andi		gr30,#~PSR_PIL,gr30		; re-enable interrupts
 | |
| 	movgs		gr30,psr
 | |
| 	subicc		gr0,#1,gr0,icc2			; clear Z, set C
 | |
| 	rett		#0
 | |
| 
 | |
| 	.size		__entry_kernel_external_interrupt_virtual_reenable,.-__entry_kernel_external_interrupt_virtual_reenable
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # entry point for Software and Progam interrupts generated whilst executing userspace code
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_uspace_softprog_interrupt
 | |
|         .type		__entry_uspace_softprog_interrupt,@function
 | |
| 	.globl		__entry_uspace_handle_mmu_fault
 | |
| __entry_uspace_softprog_interrupt:
 | |
| 	LEDS		0x6000
 | |
| #ifdef CONFIG_MMU
 | |
| 	movsg		ear0,gr28
 | |
| __entry_uspace_handle_mmu_fault:
 | |
| 	movgs		gr28,scr2
 | |
| #endif
 | |
| 	sethi.p		%hi(__kernel_frame0_ptr),gr28
 | |
| 	setlo		%lo(__kernel_frame0_ptr),gr28
 | |
| 	ldi		@(gr28,#0),gr28
 | |
| 
 | |
| 	# handle h/w single-step through exceptions
 | |
| 	sti		gr0,@(gr28,#REG__STATUS)
 | |
| 
 | |
| 	.globl		__entry_uspace_softprog_interrupt_reentry
 | |
| __entry_uspace_softprog_interrupt_reentry:
 | |
| 	LEDS		0x6001
 | |
| 
 | |
| 	setlos		#REG__END,gr30
 | |
| 	dcpl		gr28,gr30,#0
 | |
| 
 | |
| 	# set up the kernel stack pointer
 | |
| 	sti.p		sp,@(gr28,#REG_SP)
 | |
| 	ori		gr28,0,sp
 | |
| 	sti		gr0,@(gr28,#REG_GR(28))
 | |
| 
 | |
| 	stdi		gr20,@(gr28,#REG_GR(20))
 | |
| 	stdi		gr22,@(gr28,#REG_GR(22))
 | |
| 
 | |
| 	movsg		tbr,gr20
 | |
| 	movsg		pcsr,gr21
 | |
| 	movsg		psr,gr22
 | |
| 
 | |
| 	sethi.p		%hi(__entry_return_from_user_exception),gr23
 | |
| 	setlo		%lo(__entry_return_from_user_exception),gr23
 | |
| 
 | |
| 	bra		__entry_common
 | |
| 
 | |
| 	.size		__entry_uspace_softprog_interrupt,.-__entry_uspace_softprog_interrupt
 | |
| 
 | |
| 	# single-stepping was disabled on entry to a TLB handler that then faulted
 | |
| #ifdef CONFIG_MMU
 | |
| 	.globl		__entry_uspace_handle_mmu_fault_sstep
 | |
| __entry_uspace_handle_mmu_fault_sstep:
 | |
| 	movgs		gr28,scr2
 | |
| 	sethi.p		%hi(__kernel_frame0_ptr),gr28
 | |
| 	setlo		%lo(__kernel_frame0_ptr),gr28
 | |
| 	ldi		@(gr28,#0),gr28
 | |
| 
 | |
| 	# flag single-step re-enablement
 | |
| 	sti		gr0,@(gr28,#REG__STATUS)
 | |
| 	bra		__entry_uspace_softprog_interrupt_reentry
 | |
| #endif
 | |
| 
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # entry point for Software and Progam interrupts generated whilst executing kernel code
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_kernel_softprog_interrupt
 | |
|         .type		__entry_kernel_softprog_interrupt,@function
 | |
| __entry_kernel_softprog_interrupt:
 | |
| 	LEDS		0x6004
 | |
| 
 | |
| #ifdef CONFIG_MMU
 | |
| 	movsg		ear0,gr30
 | |
| 	movgs		gr30,scr2
 | |
| #endif
 | |
| 
 | |
| 	.globl		__entry_kernel_handle_mmu_fault
 | |
| __entry_kernel_handle_mmu_fault:
 | |
| 	# set up the stack pointer
 | |
| 	subi		sp,#REG__END,sp
 | |
| 	sti		sp,@(sp,#REG_SP)
 | |
| 	sti		sp,@(sp,#REG_SP-4)
 | |
| 	andi		sp,#~7,sp
 | |
| 
 | |
| 	# handle h/w single-step through exceptions
 | |
| 	sti		gr0,@(sp,#REG__STATUS)
 | |
| 
 | |
| 	.globl		__entry_kernel_softprog_interrupt_reentry
 | |
| __entry_kernel_softprog_interrupt_reentry:
 | |
| 	LEDS		0x6005
 | |
| 
 | |
| 	setlos		#REG__END,gr30
 | |
| 	dcpl		sp,gr30,#0
 | |
| 
 | |
| 	# set up the exception frame
 | |
| 	sti.p		gr28,@(sp,#REG_GR(28))
 | |
| 	ori		sp,0,gr28
 | |
| 
 | |
| 	stdi		gr20,@(gr28,#REG_GR(20))
 | |
| 	stdi		gr22,@(gr28,#REG_GR(22))
 | |
| 
 | |
| 	ldi		@(sp,#REG_SP),gr22		/* reconstruct the old SP */
 | |
| 	addi		gr22,#REG__END,gr22
 | |
| 	sti		gr22,@(sp,#REG_SP)
 | |
| 
 | |
| 	# set CCCR.CC3 to Undefined to abort atomic-modify completion inside the kernel
 | |
| 	# - for an explanation of how it works, see: Documentation/frv/atomic-ops.txt
 | |
| 	movsg		cccr,gr20
 | |
| 	andi		gr20,#~0xc0,gr20
 | |
| 	movgs		gr20,cccr
 | |
| 
 | |
| 	movsg		tbr,gr20
 | |
| 	movsg		pcsr,gr21
 | |
| 	movsg		psr,gr22
 | |
| 
 | |
| 	sethi.p		%hi(__entry_return_from_kernel_exception),gr23
 | |
| 	setlo		%lo(__entry_return_from_kernel_exception),gr23
 | |
| 	bra		__entry_common
 | |
| 
 | |
| 	.size		__entry_kernel_softprog_interrupt,.-__entry_kernel_softprog_interrupt
 | |
| 
 | |
| 	# single-stepping was disabled on entry to a TLB handler that then faulted
 | |
| #ifdef CONFIG_MMU
 | |
| 	.globl		__entry_kernel_handle_mmu_fault_sstep
 | |
| __entry_kernel_handle_mmu_fault_sstep:
 | |
| 	# set up the stack pointer
 | |
| 	subi		sp,#REG__END,sp
 | |
| 	sti		sp,@(sp,#REG_SP)
 | |
| 	sti		sp,@(sp,#REG_SP-4)
 | |
| 	andi		sp,#~7,sp
 | |
| 
 | |
| 	# flag single-step re-enablement
 | |
| 	sethi		#REG__STATUS_STEP,gr30
 | |
| 	sti		gr30,@(sp,#REG__STATUS)
 | |
| 	bra		__entry_kernel_softprog_interrupt_reentry
 | |
| #endif
 | |
| 
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # the rest of the kernel entry point code
 | |
| # - on arriving here, the following registers should be set up:
 | |
| #	GR1	- kernel stack pointer
 | |
| #	GR7	- syscall number (trap 0 only)
 | |
| #	GR8-13	- syscall args (trap 0 only)
 | |
| #	GR20	- saved TBR
 | |
| #	GR21	- saved PC
 | |
| #	GR22	- saved PSR
 | |
| #	GR23	- return handler address
 | |
| #	GR28	- exception frame on stack
 | |
| #	SCR2	- saved EAR0 where applicable (clobbered by ICI & ICEF insns on FR451)
 | |
| #	PSR	- PSR.S 1, PSR.ET 0
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_common
 | |
|         .type		__entry_common,@function
 | |
| __entry_common:
 | |
| 	LEDS		0x6008
 | |
| 
 | |
| 	# finish building the exception frame
 | |
| 	stdi		gr2,@(gr28,#REG_GR(2))
 | |
| 	stdi		gr4,@(gr28,#REG_GR(4))
 | |
| 	stdi		gr6,@(gr28,#REG_GR(6))
 | |
| 	stdi		gr8,@(gr28,#REG_GR(8))
 | |
| 	stdi		gr10,@(gr28,#REG_GR(10))
 | |
| 	stdi		gr12,@(gr28,#REG_GR(12))
 | |
| 	stdi		gr14,@(gr28,#REG_GR(14))
 | |
| 	stdi		gr16,@(gr28,#REG_GR(16))
 | |
| 	stdi		gr18,@(gr28,#REG_GR(18))
 | |
| 	stdi		gr24,@(gr28,#REG_GR(24))
 | |
| 	stdi		gr26,@(gr28,#REG_GR(26))
 | |
| 	sti		gr29,@(gr28,#REG_GR(29))
 | |
| 	stdi		gr30,@(gr28,#REG_GR(30))
 | |
| 
 | |
| 	movsg		lcr ,gr27
 | |
| 	movsg		lr  ,gr26
 | |
| 	movgs		gr23,lr
 | |
| 	movsg		cccr,gr25
 | |
| 	movsg		ccr ,gr24
 | |
| 	movsg		isr ,gr23
 | |
| 
 | |
| 	setlos.p	#-1,gr4
 | |
| 	andi		gr22,#PSR_PS,gr5		/* try to rebuild original PSR value */
 | |
| 	andi.p		gr22,#~(PSR_PS|PSR_S),gr6
 | |
| 	slli		gr5,#1,gr5
 | |
| 	or		gr6,gr5,gr5
 | |
| 	andi		gr5,#~PSR_ET,gr5
 | |
| 
 | |
| 	sti		gr20,@(gr28,#REG_TBR)
 | |
| 	sti		gr21,@(gr28,#REG_PC)
 | |
| 	sti		gr5 ,@(gr28,#REG_PSR)
 | |
| 	sti		gr23,@(gr28,#REG_ISR)
 | |
| 	stdi		gr24,@(gr28,#REG_CCR)
 | |
| 	stdi		gr26,@(gr28,#REG_LR)
 | |
| 	sti		gr4 ,@(gr28,#REG_SYSCALLNO)
 | |
| 
 | |
| 	movsg		iacc0h,gr4
 | |
| 	movsg		iacc0l,gr5
 | |
| 	stdi		gr4,@(gr28,#REG_IACC0)
 | |
| 
 | |
| 	movsg		gner0,gr4
 | |
| 	movsg		gner1,gr5
 | |
| 	stdi.p		gr4,@(gr28,#REG_GNER0)
 | |
| 
 | |
| 	# set up virtual interrupt disablement
 | |
| 	subicc		gr0,#1,gr0,icc2			/* clear Z flag, set C flag */
 | |
| 
 | |
| 	# set up kernel global registers
 | |
| 	sethi.p		%hi(__kernel_current_task),gr5
 | |
| 	setlo		%lo(__kernel_current_task),gr5
 | |
| 	sethi.p		%hi(_gp),gr16
 | |
| 	setlo		%lo(_gp),gr16
 | |
| 	ldi		@(gr5,#0),gr29
 | |
| 	ldi		@(gr29,#4),gr15		; __current_thread_info = current->thread_info
 | |
| 
 | |
| 	# switch to the kernel trap table
 | |
| 	sethi.p		%hi(__entry_kerneltrap_table),gr6
 | |
| 	setlo		%lo(__entry_kerneltrap_table),gr6
 | |
| 	movgs		gr6,tbr
 | |
| 
 | |
| 	# make sure we (the kernel) get div-zero and misalignment exceptions
 | |
| 	setlos		#ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
 | |
| 	movgs		gr5,isr
 | |
| 
 | |
| 	# clear power-saving mode flags
 | |
| 	movsg		hsr0,gr4
 | |
| 	andi		gr4,#~HSR0_PDM,gr4
 | |
| 	movgs		gr4,hsr0
 | |
| 
 | |
| 	# multiplex again using old TBR as a guide
 | |
| 	setlos.p	#TBR_TT,gr3
 | |
| 	sethi		%hi(__entry_vector_table),gr6
 | |
| 	and.p		gr20,gr3,gr5
 | |
| 	setlo		%lo(__entry_vector_table),gr6
 | |
| 	srli		gr5,#2,gr5
 | |
| 	ld		@(gr5,gr6),gr5
 | |
| 
 | |
| 	LEDS		0x6009
 | |
| 	jmpl		@(gr5,gr0)
 | |
| 
 | |
| 
 | |
| 	.size		__entry_common,.-__entry_common
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle instruction MMU fault
 | |
| #
 | |
| ###############################################################################
 | |
| #ifdef CONFIG_MMU
 | |
| 	.globl		__entry_insn_mmu_fault
 | |
| __entry_insn_mmu_fault:
 | |
| 	LEDS		0x6010
 | |
| 	setlos		#0,gr8
 | |
| 	movsg		esr0,gr9
 | |
| 	movsg		scr2,gr10
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 
 | |
| 	sethi.p		%hi(do_page_fault),gr5
 | |
| 	setlo		%lo(do_page_fault),gr5
 | |
| 	jmpl		@(gr5,gr0)	; call do_page_fault(0,esr0,ear0)
 | |
| #endif
 | |
| 
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle instruction access error
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_insn_access_error
 | |
| __entry_insn_access_error:
 | |
| 	LEDS		0x6011
 | |
| 	sethi.p		%hi(insn_access_error),gr5
 | |
| 	setlo		%lo(insn_access_error),gr5
 | |
| 	movsg		esfr1,gr8
 | |
| 	movsg		epcr0,gr9
 | |
| 	movsg		esr0,gr10
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	jmpl		@(gr5,gr0)	; call insn_access_error(esfr1,epcr0,esr0)
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle various instructions of dubious legality
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_unsupported_trap
 | |
| 	.globl		__entry_illegal_instruction
 | |
| 	.globl		__entry_privileged_instruction
 | |
| 	.globl		__entry_debug_exception
 | |
| __entry_unsupported_trap:
 | |
| 	subi		gr21,#4,gr21
 | |
| 	sti		gr21,@(gr28,#REG_PC)
 | |
| __entry_illegal_instruction:
 | |
| __entry_privileged_instruction:
 | |
| __entry_debug_exception:
 | |
| 	LEDS		0x6012
 | |
| 	sethi.p		%hi(illegal_instruction),gr5
 | |
| 	setlo		%lo(illegal_instruction),gr5
 | |
| 	movsg		esfr1,gr8
 | |
| 	movsg		epcr0,gr9
 | |
| 	movsg		esr0,gr10
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	jmpl		@(gr5,gr0)	; call ill_insn(esfr1,epcr0,esr0)
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle atomic operation emulation for userspace
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_atomic_op
 | |
| __entry_atomic_op:
 | |
| 	LEDS		0x6012
 | |
| 	sethi.p		%hi(atomic_operation),gr5
 | |
| 	setlo		%lo(atomic_operation),gr5
 | |
| 	movsg		esfr1,gr8
 | |
| 	movsg		epcr0,gr9
 | |
| 	movsg		esr0,gr10
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	jmpl		@(gr5,gr0)	; call atomic_operation(esfr1,epcr0,esr0)
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle media exception
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_media_exception
 | |
| __entry_media_exception:
 | |
| 	LEDS		0x6013
 | |
| 	sethi.p		%hi(media_exception),gr5
 | |
| 	setlo		%lo(media_exception),gr5
 | |
| 	movsg		msr0,gr8
 | |
| 	movsg		msr1,gr9
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	jmpl		@(gr5,gr0)	; call media_excep(msr0,msr1)
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle data MMU fault
 | |
| # handle data DAT fault (write-protect exception)
 | |
| #
 | |
| ###############################################################################
 | |
| #ifdef CONFIG_MMU
 | |
| 	.globl		__entry_data_mmu_fault
 | |
| __entry_data_mmu_fault:
 | |
| 	.globl		__entry_data_dat_fault
 | |
| __entry_data_dat_fault:
 | |
| 	LEDS		0x6014
 | |
| 	setlos		#1,gr8
 | |
| 	movsg		esr0,gr9
 | |
| 	movsg		scr2,gr10	; saved EAR0
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 
 | |
| 	sethi.p		%hi(do_page_fault),gr5
 | |
| 	setlo		%lo(do_page_fault),gr5
 | |
| 	jmpl		@(gr5,gr0)	; call do_page_fault(1,esr0,ear0)
 | |
| #endif
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle data and instruction access exceptions
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_insn_access_exception
 | |
| 	.globl		__entry_data_access_exception
 | |
| __entry_insn_access_exception:
 | |
| __entry_data_access_exception:
 | |
| 	LEDS		0x6016
 | |
| 	sethi.p		%hi(memory_access_exception),gr5
 | |
| 	setlo		%lo(memory_access_exception),gr5
 | |
| 	movsg		esr0,gr8
 | |
| 	movsg		scr2,gr9	; saved EAR0
 | |
| 	movsg		epcr0,gr10
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	jmpl		@(gr5,gr0)	; call memory_access_error(esr0,ear0,epcr0)
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle data access error
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_data_access_error
 | |
| __entry_data_access_error:
 | |
| 	LEDS		0x6016
 | |
| 	sethi.p		%hi(data_access_error),gr5
 | |
| 	setlo		%lo(data_access_error),gr5
 | |
| 	movsg		esfr1,gr8
 | |
| 	movsg		esr15,gr9
 | |
| 	movsg		ear15,gr10
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	jmpl		@(gr5,gr0)	; call data_access_error(esfr1,esr15,ear15)
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle data store error
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_data_store_error
 | |
| __entry_data_store_error:
 | |
| 	LEDS		0x6017
 | |
| 	sethi.p		%hi(data_store_error),gr5
 | |
| 	setlo		%lo(data_store_error),gr5
 | |
| 	movsg		esfr1,gr8
 | |
| 	movsg		esr14,gr9
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	jmpl		@(gr5,gr0)	; call data_store_error(esfr1,esr14)
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle division exception
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_division_exception
 | |
| __entry_division_exception:
 | |
| 	LEDS		0x6018
 | |
| 	sethi.p		%hi(division_exception),gr5
 | |
| 	setlo		%lo(division_exception),gr5
 | |
| 	movsg		esfr1,gr8
 | |
| 	movsg		esr0,gr9
 | |
| 	movsg		isr,gr10
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	jmpl		@(gr5,gr0)	; call div_excep(esfr1,esr0,isr)
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle compound exception
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_compound_exception
 | |
| __entry_compound_exception:
 | |
| 	LEDS		0x6019
 | |
| 	sethi.p		%hi(compound_exception),gr5
 | |
| 	setlo		%lo(compound_exception),gr5
 | |
| 	movsg		esfr1,gr8
 | |
| 	movsg		esr0,gr9
 | |
| 	movsg		esr14,gr10
 | |
| 	movsg		esr15,gr11
 | |
| 	movsg		msr0,gr12
 | |
| 	movsg		msr1,gr13
 | |
| 
 | |
| 	# now that we've accessed the exception regs, we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	jmpl		@(gr5,gr0)	; call comp_excep(esfr1,esr0,esr14,esr15,msr0,msr1)
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # handle interrupts and NMIs
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_do_IRQ
 | |
| __entry_do_IRQ:
 | |
| 	LEDS		0x6020
 | |
| 
 | |
| 	# we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	bra		do_IRQ
 | |
| 
 | |
| 	.globl		__entry_do_NMI
 | |
| __entry_do_NMI:
 | |
| 	LEDS		0x6021
 | |
| 
 | |
| 	# we can enable exceptions
 | |
| 	movsg		psr,gr4
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 	bra		do_NMI
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # the return path for a newly forked child process
 | |
| # - __switch_to() saved the old current pointer in GR8 for us
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		ret_from_fork
 | |
| ret_from_fork:
 | |
| 	LEDS		0x6100
 | |
| 	call		schedule_tail
 | |
| 
 | |
| 	# fork & co. return 0 to child
 | |
| 	setlos.p	#0,gr8
 | |
| 	bra		__syscall_exit
 | |
| 
 | |
| ###################################################################################################
 | |
| #
 | |
| # Return to user mode is not as complex as all this looks,
 | |
| # but we want the default path for a system call return to
 | |
| # go as quickly as possible which is why some of this is
 | |
| # less clear than it otherwise should be.
 | |
| #
 | |
| ###################################################################################################
 | |
| 	.balign		L1_CACHE_BYTES
 | |
| 	.globl		system_call
 | |
| system_call:
 | |
| 	LEDS		0x6101
 | |
| 	movsg		psr,gr4			; enable exceptions
 | |
| 	ori		gr4,#PSR_ET,gr4
 | |
| 	movgs		gr4,psr
 | |
| 
 | |
| 	sti		gr7,@(gr28,#REG_SYSCALLNO)
 | |
| 	sti.p		gr8,@(gr28,#REG_ORIG_GR8)
 | |
| 
 | |
| 	subicc		gr7,#nr_syscalls,gr0,icc0
 | |
| 	bnc		icc0,#0,__syscall_badsys
 | |
| 
 | |
| 	ldi		@(gr15,#TI_FLAGS),gr4
 | |
| 	andicc		gr4,#_TIF_SYSCALL_TRACE,gr0,icc0
 | |
| 	bne		icc0,#0,__syscall_trace_entry
 | |
| 
 | |
| __syscall_call:
 | |
| 	slli.p		gr7,#2,gr7
 | |
| 	sethi		%hi(sys_call_table),gr5
 | |
| 	setlo		%lo(sys_call_table),gr5
 | |
| 	ld		@(gr5,gr7),gr4
 | |
| 	calll		@(gr4,gr0)
 | |
| 
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # return to interrupted process
 | |
| #
 | |
| ###############################################################################
 | |
| __syscall_exit:
 | |
| 	LEDS		0x6300
 | |
| 
 | |
| 	sti		gr8,@(gr28,#REG_GR(8))	; save return value
 | |
| 
 | |
| 	# rebuild saved psr - execve will change it for init/main.c
 | |
| 	ldi		@(gr28,#REG_PSR),gr22
 | |
| 	srli		gr22,#1,gr5
 | |
| 	andi.p		gr22,#~PSR_PS,gr22
 | |
| 	andi		gr5,#PSR_PS,gr5
 | |
| 	or		gr5,gr22,gr22
 | |
| 	ori		gr22,#PSR_S,gr22
 | |
| 
 | |
| 	# keep current PSR in GR23
 | |
| 	movsg		psr,gr23
 | |
| 
 | |
| 	# make sure we don't miss an interrupt setting need_resched or sigpending between
 | |
| 	# sampling and the RETT
 | |
| 	ori		gr23,#PSR_PIL_14,gr23
 | |
| 	movgs		gr23,psr
 | |
| 
 | |
| 	ldi		@(gr15,#TI_FLAGS),gr4
 | |
| 	sethi.p		%hi(_TIF_ALLWORK_MASK),gr5
 | |
| 	setlo		%lo(_TIF_ALLWORK_MASK),gr5
 | |
| 	andcc		gr4,gr5,gr0,icc0
 | |
| 	bne		icc0,#0,__syscall_exit_work
 | |
| 
 | |
| 	# restore all registers and return
 | |
| __entry_return_direct:
 | |
| 	LEDS		0x6301
 | |
| 
 | |
| 	andi		gr22,#~PSR_ET,gr22
 | |
| 	movgs		gr22,psr
 | |
| 
 | |
| 	ldi		@(gr28,#REG_ISR),gr23
 | |
| 	lddi		@(gr28,#REG_CCR),gr24
 | |
| 	lddi		@(gr28,#REG_LR) ,gr26
 | |
| 	ldi		@(gr28,#REG_PC) ,gr21
 | |
| 	ldi		@(gr28,#REG_TBR),gr20
 | |
| 
 | |
| 	movgs		gr20,tbr
 | |
| 	movgs		gr21,pcsr
 | |
| 	movgs		gr23,isr
 | |
| 	movgs		gr24,ccr
 | |
| 	movgs		gr25,cccr
 | |
| 	movgs		gr26,lr
 | |
| 	movgs		gr27,lcr
 | |
| 
 | |
| 	lddi		@(gr28,#REG_GNER0),gr4
 | |
| 	movgs		gr4,gner0
 | |
| 	movgs		gr5,gner1
 | |
| 
 | |
| 	lddi		@(gr28,#REG_IACC0),gr4
 | |
| 	movgs		gr4,iacc0h
 | |
| 	movgs		gr5,iacc0l
 | |
| 
 | |
| 	lddi		@(gr28,#REG_GR(4)) ,gr4
 | |
| 	lddi		@(gr28,#REG_GR(6)) ,gr6
 | |
| 	lddi		@(gr28,#REG_GR(8)) ,gr8
 | |
| 	lddi		@(gr28,#REG_GR(10)),gr10
 | |
| 	lddi		@(gr28,#REG_GR(12)),gr12
 | |
| 	lddi		@(gr28,#REG_GR(14)),gr14
 | |
| 	lddi		@(gr28,#REG_GR(16)),gr16
 | |
| 	lddi		@(gr28,#REG_GR(18)),gr18
 | |
| 	lddi		@(gr28,#REG_GR(20)),gr20
 | |
| 	lddi		@(gr28,#REG_GR(22)),gr22
 | |
| 	lddi		@(gr28,#REG_GR(24)),gr24
 | |
| 	lddi		@(gr28,#REG_GR(26)),gr26
 | |
| 	ldi		@(gr28,#REG_GR(29)),gr29
 | |
| 	lddi		@(gr28,#REG_GR(30)),gr30
 | |
| 
 | |
| 	# check to see if a debugging return is required
 | |
| 	LEDS		0x67f0
 | |
| 	movsg		ccr,gr2
 | |
| 	ldi		@(gr28,#REG__STATUS),gr3
 | |
| 	andicc		gr3,#REG__STATUS_STEP,gr0,icc0
 | |
| 	bne		icc0,#0,__entry_return_singlestep
 | |
| 	movgs		gr2,ccr
 | |
| 
 | |
| 	ldi		@(gr28,#REG_SP)    ,sp
 | |
| 	lddi		@(gr28,#REG_GR(2)) ,gr2
 | |
| 	ldi		@(gr28,#REG_GR(28)),gr28
 | |
| 
 | |
| 	LEDS		0x67fe
 | |
| //	movsg		pcsr,gr31
 | |
| //	LEDS32
 | |
| 
 | |
| #if 0
 | |
| 	# store the current frame in the workram on the FR451
 | |
| 	movgs		gr28,scr2
 | |
| 	sethi.p		%hi(0xfe800000),gr28
 | |
| 	setlo		%lo(0xfe800000),gr28
 | |
| 
 | |
| 	stdi		gr2,@(gr28,#REG_GR(2))
 | |
| 	stdi		gr4,@(gr28,#REG_GR(4))
 | |
| 	stdi		gr6,@(gr28,#REG_GR(6))
 | |
| 	stdi		gr8,@(gr28,#REG_GR(8))
 | |
| 	stdi		gr10,@(gr28,#REG_GR(10))
 | |
| 	stdi		gr12,@(gr28,#REG_GR(12))
 | |
| 	stdi		gr14,@(gr28,#REG_GR(14))
 | |
| 	stdi		gr16,@(gr28,#REG_GR(16))
 | |
| 	stdi		gr18,@(gr28,#REG_GR(18))
 | |
| 	stdi		gr24,@(gr28,#REG_GR(24))
 | |
| 	stdi		gr26,@(gr28,#REG_GR(26))
 | |
| 	sti		gr29,@(gr28,#REG_GR(29))
 | |
| 	stdi		gr30,@(gr28,#REG_GR(30))
 | |
| 
 | |
| 	movsg		tbr ,gr30
 | |
| 	sti		gr30,@(gr28,#REG_TBR)
 | |
| 	movsg		pcsr,gr30
 | |
| 	sti		gr30,@(gr28,#REG_PC)
 | |
| 	movsg		psr ,gr30
 | |
| 	sti		gr30,@(gr28,#REG_PSR)
 | |
| 	movsg		isr ,gr30
 | |
| 	sti		gr30,@(gr28,#REG_ISR)
 | |
| 	movsg		ccr ,gr30
 | |
| 	movsg		cccr,gr31
 | |
| 	stdi		gr30,@(gr28,#REG_CCR)
 | |
| 	movsg		lr  ,gr30
 | |
| 	movsg		lcr ,gr31
 | |
| 	stdi		gr30,@(gr28,#REG_LR)
 | |
| 	sti		gr0 ,@(gr28,#REG_SYSCALLNO)
 | |
| 	movsg		scr2,gr28
 | |
| #endif
 | |
| 
 | |
| 	rett		#0
 | |
| 
 | |
| 	# return via break.S
 | |
| __entry_return_singlestep:
 | |
| 	movgs		gr2,ccr
 | |
| 	lddi		@(gr28,#REG_GR(2)) ,gr2
 | |
| 	ldi		@(gr28,#REG_SP)    ,sp
 | |
| 	ldi		@(gr28,#REG_GR(28)),gr28
 | |
| 	LEDS		0x67ff
 | |
| 	break
 | |
| 	.globl		__entry_return_singlestep_breaks_here
 | |
| __entry_return_singlestep_breaks_here:
 | |
| 	nop
 | |
| 
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # return to a process interrupted in kernel space
 | |
| # - we need to consider preemption if that is enabled
 | |
| #
 | |
| ###############################################################################
 | |
| 	.balign		L1_CACHE_BYTES
 | |
| __entry_return_from_kernel_exception:
 | |
| 	LEDS		0x6302
 | |
| 	movsg		psr,gr23
 | |
| 	ori		gr23,#PSR_PIL_14,gr23
 | |
| 	movgs		gr23,psr
 | |
| 	bra		__entry_return_direct
 | |
| 
 | |
| 	.balign		L1_CACHE_BYTES
 | |
| __entry_return_from_kernel_interrupt:
 | |
| 	LEDS		0x6303
 | |
| 	movsg		psr,gr23
 | |
| 	ori		gr23,#PSR_PIL_14,gr23
 | |
| 	movgs		gr23,psr
 | |
| 
 | |
| #ifdef CONFIG_PREEMPT
 | |
| 	ldi		@(gr15,#TI_PRE_COUNT),gr5
 | |
| 	subicc		gr5,#0,gr0,icc0
 | |
| 	beq		icc0,#0,__entry_return_direct
 | |
| 
 | |
| __entry_preempt_need_resched:
 | |
| 	ldi		@(gr15,#TI_FLAGS),gr4
 | |
| 	andicc		gr4,#_TIF_NEED_RESCHED,gr0,icc0
 | |
| 	beq		icc0,#1,__entry_return_direct
 | |
| 
 | |
| 	setlos		#PREEMPT_ACTIVE,gr5
 | |
| 	sti		gr5,@(gr15,#TI_FLAGS)
 | |
| 
 | |
| 	andi		gr23,#~PSR_PIL,gr23
 | |
| 	movgs		gr23,psr
 | |
| 
 | |
| 	call		schedule
 | |
| 	sti		gr0,@(gr15,#TI_PRE_COUNT)
 | |
| 
 | |
| 	movsg		psr,gr23
 | |
| 	ori		gr23,#PSR_PIL_14,gr23
 | |
| 	movgs		gr23,psr
 | |
| 	bra		__entry_preempt_need_resched
 | |
| #else
 | |
| 	bra		__entry_return_direct
 | |
| #endif
 | |
| 
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # perform work that needs to be done immediately before resumption
 | |
| #
 | |
| ###############################################################################
 | |
| 	.globl		__entry_return_from_user_exception
 | |
| 	.balign		L1_CACHE_BYTES
 | |
| __entry_return_from_user_exception:
 | |
| 	LEDS		0x6501
 | |
| 
 | |
| __entry_resume_userspace:
 | |
| 	# make sure we don't miss an interrupt setting need_resched or sigpending between
 | |
| 	# sampling and the RETT
 | |
| 	movsg		psr,gr23
 | |
| 	ori		gr23,#PSR_PIL_14,gr23
 | |
| 	movgs		gr23,psr
 | |
| 
 | |
| __entry_return_from_user_interrupt:
 | |
| 	LEDS		0x6402
 | |
| 	ldi		@(gr15,#TI_FLAGS),gr4
 | |
| 	sethi.p		%hi(_TIF_WORK_MASK),gr5
 | |
| 	setlo		%lo(_TIF_WORK_MASK),gr5
 | |
| 	andcc		gr4,gr5,gr0,icc0
 | |
| 	beq		icc0,#1,__entry_return_direct
 | |
| 
 | |
| __entry_work_pending:
 | |
| 	LEDS		0x6404
 | |
| 	andicc		gr4,#_TIF_NEED_RESCHED,gr0,icc0
 | |
| 	beq		icc0,#1,__entry_work_notifysig
 | |
| 
 | |
| __entry_work_resched:
 | |
| 	LEDS		0x6408
 | |
| 	movsg		psr,gr23
 | |
| 	andi		gr23,#~PSR_PIL,gr23
 | |
| 	movgs		gr23,psr
 | |
| 	call		schedule
 | |
| 	movsg		psr,gr23
 | |
| 	ori		gr23,#PSR_PIL_14,gr23
 | |
| 	movgs		gr23,psr
 | |
| 
 | |
| 	LEDS		0x6401
 | |
| 	ldi		@(gr15,#TI_FLAGS),gr4
 | |
| 	sethi.p		%hi(_TIF_WORK_MASK),gr5
 | |
| 	setlo		%lo(_TIF_WORK_MASK),gr5
 | |
| 	andcc		gr4,gr5,gr0,icc0
 | |
| 	beq		icc0,#1,__entry_return_direct
 | |
| 	andicc		gr4,#_TIF_NEED_RESCHED,gr0,icc0
 | |
| 	bne		icc0,#1,__entry_work_resched
 | |
| 
 | |
| __entry_work_notifysig:
 | |
| 	LEDS		0x6410
 | |
| 	ori.p		gr4,#0,gr8
 | |
| 	call		do_notify_resume
 | |
| 	bra		__entry_resume_userspace
 | |
| 
 | |
| 	# perform syscall entry tracing
 | |
| __syscall_trace_entry:
 | |
| 	LEDS		0x6320
 | |
| 	call		syscall_trace_entry
 | |
| 
 | |
| 	lddi.p		@(gr28,#REG_GR(8)) ,gr8
 | |
| 	ori		gr8,#0,gr7		; syscall_trace_entry() returned new syscallno
 | |
| 	lddi		@(gr28,#REG_GR(10)),gr10
 | |
| 	lddi.p		@(gr28,#REG_GR(12)),gr12
 | |
| 
 | |
| 	subicc		gr7,#nr_syscalls,gr0,icc0
 | |
| 	bnc		icc0,#0,__syscall_badsys
 | |
| 	bra		__syscall_call
 | |
| 
 | |
| 	# perform syscall exit tracing
 | |
| __syscall_exit_work:
 | |
| 	LEDS		0x6340
 | |
| 	andicc		gr4,#_TIF_SYSCALL_TRACE,gr0,icc0
 | |
| 	beq		icc0,#1,__entry_work_pending
 | |
| 
 | |
| 	movsg		psr,gr23
 | |
| 	andi		gr23,#~PSR_PIL,gr23	; could let syscall_trace_exit() call schedule()
 | |
| 	movgs		gr23,psr
 | |
| 
 | |
| 	call		syscall_trace_exit
 | |
| 	bra		__entry_resume_userspace
 | |
| 
 | |
| __syscall_badsys:
 | |
| 	LEDS		0x6380
 | |
| 	setlos		#-ENOSYS,gr8
 | |
| 	sti		gr8,@(gr28,#REG_GR(8))	; save return value
 | |
| 	bra		__entry_resume_userspace
 | |
| 
 | |
| 
 | |
| ###############################################################################
 | |
| #
 | |
| # syscall vector table
 | |
| #
 | |
| ###############################################################################
 | |
| 	.section .rodata
 | |
| ALIGN
 | |
| 	.globl		sys_call_table
 | |
| sys_call_table:
 | |
| 	.long sys_restart_syscall	/* 0 - old "setup()" system call, used for restarting */
 | |
| 	.long sys_exit
 | |
| 	.long sys_fork
 | |
| 	.long sys_read
 | |
| 	.long sys_write
 | |
| 	.long sys_open		/* 5 */
 | |
| 	.long sys_close
 | |
| 	.long sys_waitpid
 | |
| 	.long sys_creat
 | |
| 	.long sys_link
 | |
| 	.long sys_unlink		/* 10 */
 | |
| 	.long sys_execve
 | |
| 	.long sys_chdir
 | |
| 	.long sys_time
 | |
| 	.long sys_mknod
 | |
| 	.long sys_chmod		/* 15 */
 | |
| 	.long sys_lchown16
 | |
| 	.long sys_ni_syscall			/* old break syscall holder */
 | |
| 	.long sys_stat
 | |
| 	.long sys_lseek
 | |
| 	.long sys_getpid		/* 20 */
 | |
| 	.long sys_mount
 | |
| 	.long sys_oldumount
 | |
| 	.long sys_setuid16
 | |
| 	.long sys_getuid16
 | |
| 	.long sys_ni_syscall // sys_stime		/* 25 */
 | |
| 	.long sys_ptrace
 | |
| 	.long sys_alarm
 | |
| 	.long sys_fstat
 | |
| 	.long sys_pause
 | |
| 	.long sys_utime		/* 30 */
 | |
| 	.long sys_ni_syscall			/* old stty syscall holder */
 | |
| 	.long sys_ni_syscall			/* old gtty syscall holder */
 | |
| 	.long sys_access
 | |
| 	.long sys_nice
 | |
| 	.long sys_ni_syscall	/* 35 */	/* old ftime syscall holder */
 | |
| 	.long sys_sync
 | |
| 	.long sys_kill
 | |
| 	.long sys_rename
 | |
| 	.long sys_mkdir
 | |
| 	.long sys_rmdir		/* 40 */
 | |
| 	.long sys_dup
 | |
| 	.long sys_pipe
 | |
| 	.long sys_times
 | |
| 	.long sys_ni_syscall			/* old prof syscall holder */
 | |
| 	.long sys_brk		/* 45 */
 | |
| 	.long sys_setgid16
 | |
| 	.long sys_getgid16
 | |
| 	.long sys_ni_syscall // sys_signal
 | |
| 	.long sys_geteuid16
 | |
| 	.long sys_getegid16	/* 50 */
 | |
| 	.long sys_acct
 | |
| 	.long sys_umount				/* recycled never used phys( */
 | |
| 	.long sys_ni_syscall			/* old lock syscall holder */
 | |
| 	.long sys_ioctl
 | |
| 	.long sys_fcntl		/* 55 */
 | |
| 	.long sys_ni_syscall			/* old mpx syscall holder */
 | |
| 	.long sys_setpgid
 | |
| 	.long sys_ni_syscall			/* old ulimit syscall holder */
 | |
| 	.long sys_ni_syscall			/* old old uname syscall */
 | |
| 	.long sys_umask		/* 60 */
 | |
| 	.long sys_chroot
 | |
| 	.long sys_ustat
 | |
| 	.long sys_dup2
 | |
| 	.long sys_getppid
 | |
| 	.long sys_getpgrp	/* 65 */
 | |
| 	.long sys_setsid
 | |
| 	.long sys_sigaction
 | |
| 	.long sys_ni_syscall // sys_sgetmask
 | |
| 	.long sys_ni_syscall // sys_ssetmask
 | |
| 	.long sys_setreuid16	/* 70 */
 | |
| 	.long sys_setregid16
 | |
| 	.long sys_sigsuspend
 | |
| 	.long sys_ni_syscall // sys_sigpending
 | |
| 	.long sys_sethostname
 | |
| 	.long sys_setrlimit	/* 75 */
 | |
| 	.long sys_ni_syscall // sys_old_getrlimit
 | |
| 	.long sys_getrusage
 | |
| 	.long sys_gettimeofday
 | |
| 	.long sys_settimeofday
 | |
| 	.long sys_getgroups16	/* 80 */
 | |
| 	.long sys_setgroups16
 | |
| 	.long sys_ni_syscall			/* old_select slot */
 | |
| 	.long sys_symlink
 | |
| 	.long sys_lstat
 | |
| 	.long sys_readlink		/* 85 */
 | |
| 	.long sys_uselib
 | |
| 	.long sys_swapon
 | |
| 	.long sys_reboot
 | |
| 	.long sys_ni_syscall // old_readdir
 | |
| 	.long sys_ni_syscall	/* 90 */	/* old_mmap slot */
 | |
| 	.long sys_munmap
 | |
| 	.long sys_truncate
 | |
| 	.long sys_ftruncate
 | |
| 	.long sys_fchmod
 | |
| 	.long sys_fchown16		/* 95 */
 | |
| 	.long sys_getpriority
 | |
| 	.long sys_setpriority
 | |
| 	.long sys_ni_syscall			/* old profil syscall holder */
 | |
| 	.long sys_statfs
 | |
| 	.long sys_fstatfs		/* 100 */
 | |
| 	.long sys_ni_syscall			/* ioperm for i386 */
 | |
| 	.long sys_socketcall
 | |
| 	.long sys_syslog
 | |
| 	.long sys_setitimer
 | |
| 	.long sys_getitimer	/* 105 */
 | |
| 	.long sys_newstat
 | |
| 	.long sys_newlstat
 | |
| 	.long sys_newfstat
 | |
| 	.long sys_ni_syscall	/* obsolete olduname( syscall */
 | |
| 	.long sys_ni_syscall	/* iopl for i386 */ /* 110 */
 | |
| 	.long sys_vhangup
 | |
| 	.long sys_ni_syscall	/* obsolete idle( syscall */
 | |
| 	.long sys_ni_syscall	/* vm86old for i386 */
 | |
| 	.long sys_wait4
 | |
| 	.long sys_swapoff		/* 115 */
 | |
| 	.long sys_sysinfo
 | |
| 	.long sys_ipc
 | |
| 	.long sys_fsync
 | |
| 	.long sys_sigreturn
 | |
| 	.long sys_clone		/* 120 */
 | |
| 	.long sys_setdomainname
 | |
| 	.long sys_newuname
 | |
| 	.long sys_ni_syscall	/* old "cacheflush" */
 | |
| 	.long sys_adjtimex
 | |
| 	.long sys_mprotect	/* 125 */
 | |
| 	.long sys_sigprocmask
 | |
| 	.long sys_ni_syscall	/* old "create_module" */
 | |
| 	.long sys_init_module
 | |
| 	.long sys_delete_module
 | |
| 	.long sys_ni_syscall	/* old "get_kernel_syms" */
 | |
| 	.long sys_quotactl
 | |
| 	.long sys_getpgid
 | |
| 	.long sys_fchdir
 | |
| 	.long sys_bdflush
 | |
| 	.long sys_sysfs		/* 135 */
 | |
| 	.long sys_personality
 | |
| 	.long sys_ni_syscall	/* for afs_syscall */
 | |
| 	.long sys_setfsuid16
 | |
| 	.long sys_setfsgid16
 | |
| 	.long sys_llseek		/* 140 */
 | |
| 	.long sys_getdents
 | |
| 	.long sys_select
 | |
| 	.long sys_flock
 | |
| 	.long sys_msync
 | |
| 	.long sys_readv		/* 145 */
 | |
| 	.long sys_writev
 | |
| 	.long sys_getsid
 | |
| 	.long sys_fdatasync
 | |
| 	.long sys_sysctl
 | |
| 	.long sys_mlock		/* 150 */
 | |
| 	.long sys_munlock
 | |
| 	.long sys_mlockall
 | |
| 	.long sys_munlockall
 | |
| 	.long sys_sched_setparam
 | |
| 	.long sys_sched_getparam   /* 155 */
 | |
| 	.long sys_sched_setscheduler
 | |
| 	.long sys_sched_getscheduler
 | |
| 	.long sys_sched_yield
 | |
| 	.long sys_sched_get_priority_max
 | |
| 	.long sys_sched_get_priority_min  /* 160 */
 | |
| 	.long sys_sched_rr_get_interval
 | |
| 	.long sys_nanosleep
 | |
| 	.long sys_mremap
 | |
| 	.long sys_setresuid16
 | |
| 	.long sys_getresuid16	/* 165 */
 | |
| 	.long sys_ni_syscall	/* for vm86 */
 | |
| 	.long sys_ni_syscall	/* Old sys_query_module */
 | |
| 	.long sys_poll
 | |
| 	.long sys_nfsservctl
 | |
| 	.long sys_setresgid16	/* 170 */
 | |
| 	.long sys_getresgid16
 | |
| 	.long sys_prctl
 | |
| 	.long sys_rt_sigreturn
 | |
| 	.long sys_rt_sigaction
 | |
| 	.long sys_rt_sigprocmask	/* 175 */
 | |
| 	.long sys_rt_sigpending
 | |
| 	.long sys_rt_sigtimedwait
 | |
| 	.long sys_rt_sigqueueinfo
 | |
| 	.long sys_rt_sigsuspend
 | |
| 	.long sys_pread64		/* 180 */
 | |
| 	.long sys_pwrite64
 | |
| 	.long sys_chown16
 | |
| 	.long sys_getcwd
 | |
| 	.long sys_capget
 | |
| 	.long sys_capset           /* 185 */
 | |
| 	.long sys_sigaltstack
 | |
| 	.long sys_sendfile
 | |
| 	.long sys_ni_syscall		/* streams1 */
 | |
| 	.long sys_ni_syscall		/* streams2 */
 | |
| 	.long sys_vfork            /* 190 */
 | |
| 	.long sys_getrlimit
 | |
| 	.long sys_mmap2
 | |
| 	.long sys_truncate64
 | |
| 	.long sys_ftruncate64
 | |
| 	.long sys_stat64		/* 195 */
 | |
| 	.long sys_lstat64
 | |
| 	.long sys_fstat64
 | |
| 	.long sys_lchown
 | |
| 	.long sys_getuid
 | |
| 	.long sys_getgid		/* 200 */
 | |
| 	.long sys_geteuid
 | |
| 	.long sys_getegid
 | |
| 	.long sys_setreuid
 | |
| 	.long sys_setregid
 | |
| 	.long sys_getgroups	/* 205 */
 | |
| 	.long sys_setgroups
 | |
| 	.long sys_fchown
 | |
| 	.long sys_setresuid
 | |
| 	.long sys_getresuid
 | |
| 	.long sys_setresgid	/* 210 */
 | |
| 	.long sys_getresgid
 | |
| 	.long sys_chown
 | |
| 	.long sys_setuid
 | |
| 	.long sys_setgid
 | |
| 	.long sys_setfsuid		/* 215 */
 | |
| 	.long sys_setfsgid
 | |
| 	.long sys_pivot_root
 | |
| 	.long sys_mincore
 | |
| 	.long sys_madvise
 | |
| 	.long sys_getdents64	/* 220 */
 | |
| 	.long sys_fcntl64
 | |
| 	.long sys_ni_syscall	/* reserved for TUX */
 | |
| 	.long sys_ni_syscall	/* Reserved for Security */
 | |
| 	.long sys_gettid
 | |
| 	.long sys_readahead	/* 225 */
 | |
| 	.long sys_setxattr
 | |
| 	.long sys_lsetxattr
 | |
| 	.long sys_fsetxattr
 | |
| 	.long sys_getxattr
 | |
| 	.long sys_lgetxattr	/* 230 */
 | |
| 	.long sys_fgetxattr
 | |
| 	.long sys_listxattr
 | |
| 	.long sys_llistxattr
 | |
| 	.long sys_flistxattr
 | |
| 	.long sys_removexattr	/* 235 */
 | |
| 	.long sys_lremovexattr
 | |
| 	.long sys_fremovexattr
 | |
|  	.long sys_tkill
 | |
| 	.long sys_sendfile64
 | |
| 	.long sys_futex		/* 240 */
 | |
| 	.long sys_sched_setaffinity
 | |
| 	.long sys_sched_getaffinity
 | |
| 	.long sys_ni_syscall	//sys_set_thread_area
 | |
| 	.long sys_ni_syscall	//sys_get_thread_area
 | |
| 	.long sys_io_setup	/* 245 */
 | |
| 	.long sys_io_destroy
 | |
| 	.long sys_io_getevents
 | |
| 	.long sys_io_submit
 | |
| 	.long sys_io_cancel
 | |
| 	.long sys_fadvise64	/* 250 */
 | |
| 	.long sys_ni_syscall
 | |
| 	.long sys_exit_group
 | |
| 	.long sys_lookup_dcookie
 | |
| 	.long sys_epoll_create
 | |
| 	.long sys_epoll_ctl	/* 255 */
 | |
| 	.long sys_epoll_wait
 | |
|  	.long sys_remap_file_pages
 | |
|  	.long sys_set_tid_address
 | |
|  	.long sys_timer_create
 | |
|  	.long sys_timer_settime		/* 260 */
 | |
|  	.long sys_timer_gettime
 | |
|  	.long sys_timer_getoverrun
 | |
|  	.long sys_timer_delete
 | |
|  	.long sys_clock_settime
 | |
|  	.long sys_clock_gettime		/* 265 */
 | |
|  	.long sys_clock_getres
 | |
|  	.long sys_clock_nanosleep
 | |
| 	.long sys_statfs64
 | |
| 	.long sys_fstatfs64
 | |
| 	.long sys_tgkill	/* 270 */
 | |
| 	.long sys_utimes
 | |
|  	.long sys_fadvise64_64
 | |
| 	.long sys_ni_syscall	/* sys_vserver */
 | |
| 	.long sys_mbind
 | |
| 	.long sys_get_mempolicy
 | |
| 	.long sys_set_mempolicy
 | |
| 	.long sys_mq_open
 | |
| 	.long sys_mq_unlink
 | |
| 	.long sys_mq_timedsend
 | |
| 	.long sys_mq_timedreceive	/* 280 */
 | |
| 	.long sys_mq_notify
 | |
| 	.long sys_mq_getsetattr
 | |
| 	.long sys_ni_syscall		/* reserved for kexec */
 | |
| 	.long sys_waitid
 | |
| 	.long sys_ni_syscall		/* 285 */ /* available */
 | |
| 	.long sys_add_key
 | |
| 	.long sys_request_key
 | |
| 	.long sys_keyctl
 | |
| 	.long sys_ioprio_set
 | |
| 	.long sys_ioprio_get		/* 290 */
 | |
| 	.long sys_inotify_init
 | |
| 	.long sys_inotify_add_watch
 | |
| 	.long sys_inotify_rm_watch
 | |
| 	.long sys_migrate_pages
 | |
| 	.long sys_openat		/* 295 */
 | |
| 	.long sys_mkdirat
 | |
| 	.long sys_mknodat
 | |
| 	.long sys_fchownat
 | |
| 	.long sys_futimesat
 | |
| 	.long sys_fstatat64		/* 300 */
 | |
| 	.long sys_unlinkat
 | |
| 	.long sys_renameat
 | |
| 	.long sys_linkat
 | |
| 	.long sys_symlinkat
 | |
| 	.long sys_readlinkat		/* 305 */
 | |
| 	.long sys_fchmodat
 | |
| 	.long sys_faccessat
 | |
| 	.long sys_pselect6
 | |
| 	.long sys_ppoll
 | |
| 	.long sys_unshare		/* 310 */
 | |
| 	.long sys_set_robust_list
 | |
| 	.long sys_get_robust_list
 | |
| 	.long sys_splice
 | |
| 	.long sys_sync_file_range
 | |
| 	.long sys_tee			/* 315 */
 | |
| 	.long sys_vmsplice
 | |
| 	.long sys_move_pages
 | |
| 	.long sys_getcpu
 | |
| 	.long sys_epoll_pwait
 | |
| 	.long sys_utimensat		/* 320 */
 | |
| 	.long sys_signalfd
 | |
| 	.long sys_timerfd_create
 | |
| 	.long sys_eventfd
 | |
| 	.long sys_fallocate
 | |
| 	.long sys_timerfd_settime	/* 325 */
 | |
| 	.long sys_timerfd_gettime
 | |
| 	.long sys_signalfd4
 | |
| 	.long sys_eventfd2
 | |
| 	.long sys_epoll_create1
 | |
| 	.long sys_dup3			/* 330 */
 | |
| 	.long sys_pipe2
 | |
| 	.long sys_inotify_init1
 | |
| 	.long sys_preadv
 | |
| 	.long sys_pwritev
 | |
| 	.long sys_rt_tgsigqueueinfo	/* 335 */
 | |
| 	.long sys_perf_event_open
 | |
| 
 | |
| syscall_table_size = (. - sys_call_table)
 |