blob: fb8af28521fd03bfcc7303f80abea76779e1969e [file] [log] [blame]
/*
* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* TBD:
* -remove the low level wrappers for execve/rt_sigreturn/sigaltstack
* needed before task_pt_regs was invented. This saves a branch per call
* and more importantly allows clean invocation of post-syscall ptrace hook
*
* vineetg: May 2011
* -Userspace unaligned access emulation
*
* vineetg: Feb 2011 (ptrace low level code fixes)
* -traced syscall return code (r0) was not saved into pt_regs for restoring
* into user reg-file when traded task rets to user space.
* -syscalls needing arch-wrappers (mainly for passing sp as pt_regs)
* were not invoking post-syscall trace hook (jumping directly into
* ret_from_system_call)
*
* vineetg: Nov 2010:
* -Vector table jumps (@8 bytes) converted into branches (@4 bytes)
* -To maintain the slot size of 8 bytes/vector, added nop, which is
* not executed at runtime.
*
* vineetg: Nov 2009 (Everything needed for TIF_RESTORE_SIGMASK)
* -do_signal()invoked upon TIF_RESTORE_SIGMASK as well
* -Wrappers for sys_{,rt_}sigsuspend() nolonger needed as they don't
* need ptregs anymore
*
* Vineetg: Oct 2009
* -In a rare scenario, Process gets a Priv-V exception and gets scheduled
* out. Since we don't do FAKE RTIE for Priv-V, CPU excpetion state remains
* active (AE bit enabled). This causes a double fault for a subseq valid
* exception. Thus FAKE RTIE needed in low level Priv-Violation handler.
* Instr Error could also cause similar scenario, so same there as well.
*
* Vineetg: July 2009
* -Removed CONFIG_ARC_USER_FAULTS_DEBUG (dumping regs in case of fatal
* signal in user faults return path) as it is already provided by
* /proc/sys/kernel/print-fatal-signals
*
* Vineetg: April 2009:
* -Check for Valid sys call number in EV_Trap was bogus
* sys calls > NR_syscalls was _NOT_ declared bad
* sys call = NR_syscalls was _WRONGLY_ declared bad
*
* Vineetg: March 2009 : (Critical look at this file one more time)
* -Replaced and.f, nop, bz sequences with bbit0 type instruction
* -After returning from preempt_schedule_irq( ) we used to check for
* rescheuling again. That is already been done in the generic code
* -No need to maintain cpu_stat[].local_irq_count in ISR entry/exit
* -Removed the extra hops return_from_interrupt_level[1|2]
* while returning from Interrupts
* -waitpid no longer needed in syscall Table as uClibc implements it
* using wait4 syscall.
* -no need to save CALLEE Regs before execve
*
* Vineetg: March 2009 (Supporting 2 levels of Interrupts)
*
* Vineetg: Feb 2009
* -do_softirq( ) was being called twice on ISR return path
* First from irq_exit( ) in generic code
* Second in ret_from_interrupt_level[1 | 2] => REMOVED THIS
*
* Vineetg: Sept 3rd 2008:
* -Added a INSPECT_ON_IRQ macro to be called from Low Level ISR to inspect
* a variable getting clobbered (during ISR or between 2 ISRs)
* -Don't need FAKE RTIE (re-enabling exceptions before entering Excpn hdlr)
* for Instruction Error and Priviledge Violation Exceptions
*
* Vineetg: Aug 28th 2008: Bug #94984
* -Zero Overhead Loop Context shd be cleared when entering IRQ/EXcp/Trap
* Normally CPU does this automatically, however when doing FAKE rtie,
* we need to explicitly do this. The problem in macros
* FAKE_RET_FROM_EXCPN and FAKE_RET_FROM_EXCPN_LOCK_IRQ was that this bit
* was being "CLEARED" rather then "SET". Since it is Loop INHIBIT Bit,
* setting it and not clearing it clears ZOL context
*
* Vineetg: June 10th 2008
* -We can now display all 26 Regs on SegV
* For that return from a critical User fault is handled differently from
* general return from exceptions (ret_from_user_faults)
* -Machine Check doesnt run recursively
*
* Vineetg: May 16th, 2008
* - r25 now contains the Current Task when in kernel
* - SysCall wrappers for exec/signal* needn't push/pop Callee saved Regs
* - SysCall wrappers for fork siblings neednot POP callee Regs
* - Kernel Stack Switching Code now reused as a macro
*
* Vineetg: Dec 22, 2007
* Minor Surgery of Low Level ISR to make it SMP safe
* - MMU_SCRATCH0 Reg used for freeing up r9 in Level 1 ISR
* - _current_task is made an array of NR_CPUS
* - Access of _current_task wrapped inside a macro so that if hardware
* team agrees for a dedicated reg, no other code is touched
*
* Amit Bhor, Rahul Trivedi, Kanika Nema, Sameer Dhavale : Codito Tech 2004
*/
/*
------------------------------------------------------------------
Function ABI
------------------------------------------------------------------
Arguments r0 - r7
* Caller Saved Registers r0 - r12
* Callee Saved Registers r13- r25
Global Pointer (gp) r26
Frame Pointer (fp) r27
Stack Pointer (sp) r28
Interrupt link register (ilink1) r29
Interrupt link register (ilink2) r30
Branch link register (blink) r31
------------------------------------------------------------------
*/
.cpu A7
;############################ Vector Table #################################
.macro VECTOR lbl
#if 1 // Just in case, build breaks
j \lbl
#else
b \lbl
nop
#endif
.endm
.section .vector, "ax",@progbits
.align 4
/* Each entry in the vector table must occupy 2 words. Since it is a jump
* across sections (.vector to .text) we are gauranteed that 'j somewhere'
* will use the 'j limm' form of the intrsuction as long as somewhere is in
* a section other than .vector.
*/
; ********* Critical System Events **********************
VECTOR res_service ; 0x0, Restart Vector (0x0)
VECTOR mem_service ; 0x8, Mem exception (0x1)
VECTOR instr_service ; 0x10, Instrn Error (0x2)
; ******************** Device ISRs **********************
#ifdef CONFIG_TIMER_LV2
VECTOR handle_interrupt_level2 ; Timer0 level2 (0x3)
#else
VECTOR handle_interrupt_level1 ; Timer0 level1 (0x3)
#endif
VECTOR handle_interrupt_level1 ; (0x4)
#ifdef CONFIG_SERIAL_LV2
VECTOR handle_interrupt_level2 ; UART level2 (0x5)
#else
VECTOR handle_interrupt_level1 ; UART level1 (0x5)
#endif
#ifdef CONFIG_EMAC_LV2
VECTOR handle_interrupt_level2 ; EMAC level2 (0x6)
#else
VECTOR handle_interrupt_level1 ; EMAC level1 (0x6)
#endif
.rept 25
VECTOR handle_interrupt_level1 ; Other devices
.endr
/* FOR ARC600: timer = 0x3, uart = 0x8, emac = 0x10 */
; ******************** Exceptions **********************
VECTOR EV_MachineCheck ; 0x100, Fatal Machine check (0x20)
VECTOR EV_TLBMissI ; 0x108, Intruction TLB miss (0x21)
VECTOR EV_TLBMissD ; 0x110, Data TLB miss (0x22)
VECTOR EV_TLBProtV ; 0x118, Protection Violation (0x23)
; or Misaligned Access
VECTOR EV_PrivilegeV ; 0x120, Privilege Violation (0x24)
VECTOR EV_Trap ; 0x128, Trap exception (0x25)
VECTOR EV_Extension ; 0x130, Extn Intruction Excp (0x26)
.rept 24
VECTOR reserved ; Reserved Exceptions
.endr
#include <linux/linkage.h> /* contains declarations of SYMBOL_NAME */
#include <asm/entry.h> /* For the SAVE_* macros */
#include <asm/errno.h>
#include <asm/arcregs.h>
#include <asm/event-log-asm.h>
#include <asm/board/platform.h>
; ---------------------------------------------
/* .section .text, "ax",@progbits*/
SYMBOL_NAME_LABEL(res_service) ; processor restart
flag 0x1 ; not implemented
nop
nop
SYMBOL_NAME_LABEL(reserved) ; processor restart
rtie ; jump to processor initializations
;##################### Interrupt Handling ##############################
#ifdef CONFIG_ARCH_ARC_LV2_INTR
; ---------------------------------------------
; Level 2 ISR: Can interrupt a Level 1 ISR
; ---------------------------------------------
ARC_ENTRY handle_interrupt_level2
; TODO-vineetg for SMP this wont work
; free up r9 as scratchpad
st r9, [SYMBOL_NAME(int2_saved_reg)]
;Which mode (user/kernel) was the system in when intr occured
lr r9, [status32_l2]
SWITCH_TO_KERNEL_STK
SAVE_ALL_INT2
;------------------------------------------------------
; if L2 IRQ interrupted a L1 ISR, disable preemption
;------------------------------------------------------
ld r9, [sp, PT_status32] ; get statu32_l2 (saved in pt_regs)
bbit0 r9, STATUS_A1_BIT, 1f ; L1 not active when L2 IRQ, so normal
; A1 is set in status32_l2
; bump thread_info->preempt_count (Disable preemption)
GET_CURR_THR_INFO_FROM_SP(r10)
ld r9, [r10, THREAD_INFO_PREEMPT_COUNT]
add r9, r9, 1
st r9, [r10, THREAD_INFO_PREEMPT_COUNT]
1:
TAKE_SNAP_C_FROM_ASM SNAP_INTR_IN2
;------------------------------------------------------
; setup params for Linux common ISR and invoke it
;------------------------------------------------------
lr r0, [icause2]
and r0, r0, 0x1f
mov r1, sp
jl SYMBOL_NAME(process_interrupt)
mov r8,0x2
sr r8, [AUX_IRQ_LV12] ; clear bit in Sticky Status Reg
b ret_from_exception
ARC_EXIT handle_interrupt_level2
#endif
; ---------------------------------------------
; Level 1 ISR
; ---------------------------------------------
ARC_ENTRY handle_interrupt_level1
/* free up r9 as scratchpad */
#ifdef CONFIG_SMP
sr r9, [ARC_REG_SCRATCH_DATA0]
#else
st r9, [SYMBOL_NAME(int1_saved_reg)]
#endif
;Which mode (user/kernel) was the system in when intr occured
lr r9, [status32_l1]
SWITCH_TO_KERNEL_STK
SAVE_ALL_INT1
; snapshot routine takes care of disabling nested intr
TAKE_SNAP_C_FROM_ASM SNAP_INTR_IN
lr r0, [icause1]
and r0, r0, 0x1f
mov r1, sp
#ifdef CONFIG_ARCH_RUBY_SRAM_IRQ_STACK
brlt sp, RUBY_SRAM_BEGIN, 1f
brgt sp, RUBY_SRAM_BEGIN + RUBY_SRAM_SIZE, 1f
b 2f
1:
mov sp, __irq_stack_end
2:
st.a r1, [sp, -4]
#endif
jl SYMBOL_NAME(process_interrupt)
#ifdef CONFIG_ARCH_RUBY_SRAM_IRQ_STACK
ld.ab sp, [sp, 4]
#endif
mov r8,0x1
sr r8, [AUX_IRQ_LV12] ; clear bit in Sticky Status Reg
b ret_from_exception
ARC_EXIT handle_interrupt_level1
;################### Non TLB Exception Handling #############################
; ---------------------------------------------
; Instruction Error Exception Handler
; ---------------------------------------------
ARC_ENTRY instr_service
st r9, [SYMBOL_NAME(ex_saved_reg1)]
; Get Instruction from ICache and save it for further analysis
lr r9, [efa]
sr r9, [ARC_REG_IC_RAM_ADDR]
lr r9, [ARC_REG_IC_CTRL]
st r9, [SYMBOL_NAME(ex_ic_ctrl)]
lr r9, [ARC_REG_IC_DATA]
st r9, [SYMBOL_NAME(ex_ic_data)]
TAKE_SNAP_ASM r8, r9, SNAP_EXCP_IN
lr r9, [erstatus]
SWITCH_TO_KERNEL_STK
SAVE_ALL_SYS
lr r0, [ecr]
lr r1, [efa]
mov r2, sp
FAKE_RET_FROM_EXCPN r9
jl do_insterror_or_kprobe
b ret_from_exception
ARC_EXIT instr_service
; ---------------------------------------------
; Memory Error Exception Handler
; ---------------------------------------------
ARC_ENTRY mem_service
st r9, [SYMBOL_NAME(ex_saved_reg1)]
TAKE_SNAP_ASM r8, r9, SNAP_EXCP_IN
lr r9, [erstatus]
SWITCH_TO_KERNEL_STK
SAVE_ALL_SYS
lr r0, [ecr]
lr r1, [efa]
mov r2, sp
jl do_memory_error
b ret_from_exception
ARC_EXIT mem_service
; ---------------------------------------------
; Machine Check Exception Handler
; ---------------------------------------------
ARC_ENTRY EV_MachineCheck
st r9, [SYMBOL_NAME(ex_saved_reg1)]
lr r9, [erstatus]
SWITCH_TO_KERNEL_STK
SAVE_ALL_SYS
lr r0, [ecr]
lr r1, [efa]
mov r2, sp
cmp r0, 0x200100 /* Is this an overlapping TLB ? */
bne not_tlb_overlap
jl do_tlb_overlap_fault
b ret_from_exception
not_tlb_overlap:
; DEAD END: can't do much, display Regs and HALT
SAVE_CALLEE_SAVED_USER
GET_CURR_TASK_FIELD_PTR TASK_THREAD, r10
st sp, [r10, THREAD_CALLEE_REG]
j do_machine_check_fault
ARC_EXIT EV_MachineCheck
; ---------------------------------------------
; Protection Violation Exception Handler
; ---------------------------------------------
ARC_ENTRY EV_TLBProtV
; free up r9 as scratchpad
st r9, [SYMBOL_NAME(ex_saved_reg1)]
TAKE_SNAP_ASM r8, r9, SNAP_EXCP_IN
;Which mode (user/kernel) was the system in when Exception occured
lr r9, [erstatus]
SWITCH_TO_KERNEL_STK
SAVE_ALL_SYS
;---------(3) Save some more regs-----------------
; vineetg: Mar 6th: Random Seg Fault issue #1
; ecr and efa were not saved in case an Intr sneaks in
; after fake rtie
;
lr r3, [ecr]
lr r4, [efa]
; --------(4) Return from CPU Exception Mode ---------
; Fake a rtie, but rtie to next label
; That way, subsequently, do_page_fault ( ) executes in pure kernel
; mode with further Exceptions enabled
FAKE_RET_FROM_EXCPN r9
;------ (5) Type of Protection Violation? ----------
;
; ProtV Hardware Exception is triggered for Access Faults of 2 types
; -Access Violaton (WRITE to READ ONLY Page)
; -Unaligned Access (READ/WRITE on odd boundary)
;
; Handling for these 2 are completely difft in Linux
; -Access Violation may be legitimate as Linux implements COW using it.
; -Unaligned Access is wrong, but we'll try and recover from it
;
cmp r3, 0x230400 ; Misaligned data access ?
beq 4f
;========= (6a) Access Violation Processing ========
cmp r3, 0x230100
mov r1, 0x0 ; if LD exception ? write = 0
mov.ne r1, 0x1 ; else write = 1
mov r2, r4 ; faulting address
mov r0, sp ; pt_regs
jl do_page_fault
b ret_from_exception
;========== (6b) Non aligned access ============
4:
mov r0, r3 ; cause code
mov r1, r4 ; faulting address
mov r2, sp ; pt_regs
#ifdef CONFIG_ARC_MISALIGNED_ACCESS
SAVE_CALLEE_SAVED_USER
mov r3, sp ; callee_regs
#endif
jl do_misaligned_access
#ifdef CONFIG_ARC_MISALIGNED_ACCESS
RESTORE_CALLEE_SAVED_KERNEL
#endif
b ret_from_exception
ARC_EXIT EV_TLBProtV
; ---------------------------------------------
; Privilege Violation Exception Handler
; ---------------------------------------------
ARC_ENTRY EV_PrivilegeV
st r9, [SYMBOL_NAME(ex_saved_reg1)]
TAKE_SNAP_ASM r8, r9, SNAP_EXCP_IN
lr r9, [erstatus]
SWITCH_TO_KERNEL_STK
SAVE_ALL_SYS
lr r0, [ecr]
lr r1, [efa]
mov r2, sp
FAKE_RET_FROM_EXCPN r9
jl do_privilege_fault
b ret_from_exception
ARC_EXIT EV_PrivilegeV
; ---------------------------------------------
; Extension Instruction Exception Handler
; ---------------------------------------------
ARC_ENTRY EV_Extension
st r9, [SYMBOL_NAME(ex_saved_reg1)]
lr r9, [erstatus]
SWITCH_TO_KERNEL_STK
SAVE_ALL_SYS
lr r0, [ecr]
lr r1, [efa]
mov r2, sp
jl do_extension_fault
b ret_from_exception
ARC_EXIT EV_Extension
;######################### System Call Tracing #########################
tracesys:
; save EFA in case tracer wants the PC of traced task
; using ERET won't work since next-PC has already committed
lr r12, [efa]
GET_CURR_TASK_FIELD_PTR TASK_THREAD, r11
st r12, [r11, THREAD_FAULT_ADDR]
; PRE Sys Call Ptrace hook
jl SYMBOL_NAME(syscall_trace)
; Do the Sys Call as we normally would.
; Validate the Sys Call number
ld r8, [sp, PT_r8]
cmp r8, NR_syscalls
mov.hi r0, -ENOSYS
bhi tracesys_exit
; Restore the sys-call args. Mere invocation of the hook abv could have
; clobbered them (since they are in scratch regs). The tracer could also
; have deliberately changed the args: r0-r7 - Sys Calls Args
; Note that r8 - Sys Call Num has already been restored above
ld r0, [sp, PT_r0]
ld r1, [sp, PT_r1]
ld r2, [sp, PT_r2]
ld r3, [sp, PT_r3]
ld r4, [sp, PT_r4]
ld r5, [sp, PT_r5]
ld r6, [sp, PT_r6]
ld r7, [sp, PT_r7]
ld.as r9, [sys_call_table, r8]
jl [r9] ; Entry into Sys Call Handler
tracesys_exit:
st r0, [sp, PT_r0] ; sys call return value in pt_regs
;POST Sys Call Ptrace Hook
jl SYMBOL_NAME(syscall_trace)
b ret_from_exception ; NOT ret_from_system_call at is saves r0 which
; we'd done before calling post hook above
;################### Break Point TRAP ##########################
; ======= (5b) Trap is due to Break-Point =========
trap_with_param:
;make sure orig_r8 is a positive value
st NR_syscalls + 2, [sp, PT_orig_r8]
mov r0, r12
lr r1, [efa]
mov r2, sp
; Now that we have read EFA, its safe to do "fake" rtie
; and get out of CPU exception mode
FAKE_RET_FROM_EXCPN r11
; Save callee regs in case gdb wants to have a look
; SP will grow up by size of CALLEE Reg-File
; NOTE: clobbers r12
SAVE_CALLEE_SAVED_USER
; save location of saved Callee Regs @ thread_struct->pc
GET_CURR_TASK_FIELD_PTR TASK_THREAD, r10
st sp, [r10, THREAD_CALLEE_REG]
; Call the trap handler
jl do_trap
; unwind stack to discard Callee saved Regs
DISCARD_CALLEE_SAVED_USER
b ret_from_exception
;##################### Trap Handling ##############################
;
; EV_Trap caused by TRAP_S and TRAP0 instructions.
;------------------------------------------------------------------
; (1) System Calls
; :parameters in r0-r7.
; :r8 has the system call number
; (2) Break Points
;------------------------------------------------------------------
ARC_ENTRY EV_Trap
; free up r9 as scratchpad
st r9, [SYMBOL_NAME(ex_saved_reg1)]
TAKE_SNAP_ASM r10, r9, SNAP_TRAP_IN
;Which mode (user/kernel) was the system in when intr occured
lr r9, [erstatus]
SWITCH_TO_KERNEL_STK
SAVE_ALL_TRAP
;------- (4) What caused the Trap --------------
lr r12, [ecr]
and.f 0, r12, ECAUSE_PARAMETER_MASK
bnz trap_with_param
; ======= (5a) Trap is due to System Call ========
; Before doing anything, return from CPU Exception Mode
FAKE_RET_FROM_EXCPN r11
; Is this task being TRACED and Is Tracer interested in System Call tracing
GET_CURR_THR_INFO_FROM_SP r9
ld r10, [r9, THREAD_INFO_FLAGS]
and.f 0, r10, _TIF_SYSCALL_TRACE
; If yes, call the system call with the pre and post tracing hooks
bnz tracesys ; this never comes back
;============ This is normal System Call case ==========
; Sys-call num shd not exceed the total system calls avail
cmp r8, NR_syscalls
mov.hi r0, -ENOSYS
bhi ret_from_system_call
; Offset into the syscall_table and call handler
ld.as r9,[sys_call_table, r8]
jl [r9] ; Entry into Sys Call Handler
; fall through to ret_from_system_call
ARC_EXIT EV_Trap
ARC_ENTRY ret_from_system_call
st r0, [sp, PT_r0] ; sys call return value in pt_regs
; fall through yet again
; NOTE: ret_from_exception must immediately follow ret_from_system_call
;################### Return from Intr/Excp ##########################
ARC_ENTRY ret_from_exception
ld r8, [sp, PT_status32] ; returning to User/Kernel Mode
#ifdef CONFIG_PREEMPT
bbit0 r8, STATUS_U_BIT, resume_kernel_mode
#else
bbit0 r8, STATUS_U_BIT, restore_regs
#endif
; else returning to user mode
resume_user_mode:
; TODO: Fast PAth chk: Can we rush back to user mode?
; --------- do we need to resched the current user task ----
; check Thread_info->flags for need sched flag
GET_CURR_THR_INFO_FROM_SP(r10)
ld r9, [r10, THREAD_INFO_FLAGS]
bbit0 r9, TIF_NEED_RESCHED, skip_user_resched
; User Task Preemption
jl schedule
b ret_from_exception
skip_user_resched:
; --------- check for signals/restore-sigmask ------------
and.f 0, r9, (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)
bz restore_regs
; setup args for "C" routine, do_signal ( )
mov r0, sp ; pass ptr to pt_regs
; save CALLEE Regs.
; (i) For core dump: Incase this signal causes one
; (ii) If this is due to SIGTRAP/SIGSTOP, task is being traced thus
; tracer might call PEEKUSR for a callee reg
;
; NOTE: SP will grow up by size of CALLEE Reg-File
; NOTE: macro clobbers r12
SAVE_CALLEE_SAVED_USER
; save location of saved Callee Regs @ thread_struct->pc
GET_CURR_TASK_FIELD_PTR TASK_THREAD, r10
st sp,[r10, THREAD_CALLEE_REG]
jl SYMBOL_NAME(do_signal)
; unwind stack to discard Callee saved Regs
DISCARD_CALLEE_SAVED_USER
;--------- All things done, go back to Userland ------
b restore_regs
#ifdef CONFIG_PREEMPT
resume_kernel_mode:
; check preempt_count
GET_CURR_THR_INFO_FROM_SP(r10)
ld r8, [r10, THREAD_INFO_PREEMPT_COUNT]
; Preemption disabled, go back to whatever we were doing before
brne r8, 0, restore_regs
; check if this task's NEED_RESCHED flag set
ld r9, [r10, THREAD_INFO_FLAGS]
bbit0 r9, TIF_NEED_RESCHED, restore_regs
; All set to invoke preemption.
; NEED to make sure that further IRQs dont happen.
lr r9, [status32]
and r9, r9, ~(STATUS_E1_MASK | STATUS_E2_MASK)
flag r9
; Invoke PREEMPTION
jl preempt_schedule_irq
#endif
; fall through
; Restore the saved sys context (common exit-path for EXCPN/IRQ/Trap)
; IRQ shd definitely not happen between now and rtie
restore_regs :
; Disable Interrupts first
lr r10, [status32]
mov r9, r10 ;make a copy. Didn't they teach u to "save" things ?
and r9, r9, ~(STATUS_E1_MASK | STATUS_E2_MASK)
flag r9
#ifdef CONFIG_ARCH_ARC_CURR_IN_REG
; Restore User R25
; Earlier this used to be only for returning to user mode
; However with 2 levels of IRQ this can also happen even if
; in kernel mode
ld r9, [sp, PT_sp]
brhs r9, VMALLOC_START, 8f
RESTORE_USER_R25
8:
#endif
; Restore REG File. In case multiple Events outstanding,
; use the same priorty as rtie: EXCPN, L2 IRQ, L1 IRQ, None
; if Returning from Exception
bbit0 r10, STATUS_AE_BIT, not_exception
RESTORE_ALL_SYS
rtie
; Not Exception so maybe Interrupts (Level 1 or 2)
not_exception:
#ifdef CONFIG_ARCH_ARC_LV2_INTR
bbit0 r10, STATUS_A2_BIT, not_level2_interrupt
;------------------------------------------------------------------
; if L2 IRQ interrupted a L1 ISR, we'd disbaled preemption earlier
; so that sched doesnt move to new task, causing L1 to be delayed
; undeterministically. Now that we've achieved that, lets reset
; things to what they were, before returning from L2 context
;----------------------------------------------------------------
ld r9, [sp, PT_orig_r8] ; get orig_r8 to make sure it is
brne r9, -2, 149f ; infact a L2 ISR ret path
ld r9, [sp, PT_status32] ; get statu32_l2 (saved in pt_regs)
bbit0 r9, STATUS_A1_BIT, 149f ; L1 not active when L2 IRQ, so normal
; A1 is set in status32_l2
; decrement thread_info->preempt_count (re-enable preemption)
GET_CURR_THR_INFO_FROM_SP(r10)
ld r9, [r10, THREAD_INFO_PREEMPT_COUNT]
; paranoid check, given A1 was active when A2 happened, preempt count
; must not be 0 beccause we would have incremented it.
; If this does happen we simply HALT as it means a BUG !!!
cmp r9, 0
bnz 2f
flag 1
2:
sub r9, r9, 1
st r9, [r10, THREAD_INFO_PREEMPT_COUNT]
149:
TAKE_SNAP_C_FROM_ASM SNAP_INTR_OUT2
;return from level 2
RESTORE_ALL_INT2
debug_marker_l2:
rtie
not_level2_interrupt:
#endif
bbit0 r10, STATUS_A1_BIT, not_level1_interrupt
;return from level 1
TAKE_SNAP_C_FROM_ASM SNAP_INTR_OUT
RESTORE_ALL_INT1
debug_marker_l1:
rtie
not_level1_interrupt:
;this case is for syscalls or Exceptions (with fake rtie)
#ifdef CONFIG_ARC_DBG_EVENT_TIMELINE
ld r8, [sp, PT_orig_r8]
cmp r8, NR_syscalls+1
jeq 149f
TAKE_SNAP_ASM r9, r10, SNAP_TRAP_OUT
j 150f
149:
TAKE_SNAP_ASM r9, r10, SNAP_EXCP_OUT
150:
#endif
RESTORE_ALL_SYS
debug_marker_syscall:
rtie
ARC_EXIT ret_from_exception
ARC_ENTRY ret_from_fork
; when the forked child comes here from the __switch_to function
; r0 has the last task pointer.
; put last task in scheduler queue
jl SYMBOL_NAME(schedule_tail)
b SYMBOL_NAME(ret_from_exception)
ARC_EXIT ret_from_fork
;################### Special Sys Call Wrappers ##########################
ARC_ENTRY sys_execve_wrapper
; copy pointer to pt_regs as a parameter
mov r3, sp
jl SYMBOL_NAME(sys_execve)
GET_CURR_THR_INFO_FROM_SP r9
ld r10, [r9, THREAD_INFO_FLAGS]
and.f 0, r10, _TIF_SYSCALL_TRACE
bz ret_from_system_call
b tracesys_exit
ARC_EXIT sys_execve_wrapper
ARC_ENTRY sys_fork_wrapper
; copy pointer to pt_regs as a parameter
mov r0, sp
SAVE_CALLEE_SAVED_USER
jl SYMBOL_NAME(sys_fork)
DISCARD_CALLEE_SAVED_USER
GET_CURR_THR_INFO_FROM_SP r9
ld r10, [r9, THREAD_INFO_FLAGS]
and.f 0, r10, _TIF_SYSCALL_TRACE
bz ret_from_system_call
b tracesys_exit
ARC_EXIT sys_fork_wrapper
ARC_ENTRY sys_vfork_wrapper
; copy pointer to pt_regs as a parameter
mov r0, sp
SAVE_CALLEE_SAVED_USER
jl SYMBOL_NAME(sys_vfork)
DISCARD_CALLEE_SAVED_USER
GET_CURR_THR_INFO_FROM_SP r9
ld r10, [r9, THREAD_INFO_FLAGS]
and.f 0, r10, _TIF_SYSCALL_TRACE
bz ret_from_system_call
b tracesys_exit
ARC_EXIT sys_vfork_wrapper
ARC_ENTRY sys_clone_wrapper
; clone sys-call takes 2 mandatary args: @flags and @child-stack
; and it can take 3 var-args, depending on flags
; To keep sys_clone( ) signature constant, we assume all 5 args
; and set the helper @prtegs in next free reg
; this is cheap since our args are in regs, not on stack
mov r5, sp ; pt_regs
SAVE_CALLEE_SAVED_USER
jl SYMBOL_NAME(sys_clone)
DISCARD_CALLEE_SAVED_USER
GET_CURR_THR_INFO_FROM_SP r9
ld r10, [r9, THREAD_INFO_FLAGS]
and.f 0, r10, _TIF_SYSCALL_TRACE
bz ret_from_system_call
b tracesys_exit
ARC_EXIT sys_clone_wrapper
;################### Sys Call Table ##########################
; The syscall table starts here...
.data
ARC_ENTRY sys_call_table
__syscall_start:
/* 0 */ .long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork_wrapper)
.long SYMBOL_NAME(sys_read)
.long SYMBOL_NAME(sys_write)
/* 5 */ .long SYMBOL_NAME(sys_open)
.long SYMBOL_NAME(sys_close)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_waitpid */
.long SYMBOL_NAME(sys_creat)
.long SYMBOL_NAME(sys_link)
/* 10 */ .long SYMBOL_NAME(sys_unlink)
.long SYMBOL_NAME(sys_execve_wrapper)
.long SYMBOL_NAME(sys_chdir)
.long SYMBOL_NAME(sys_time) /* used by libc4 */
.long SYMBOL_NAME(sys_mknod)
/* 15 */ .long SYMBOL_NAME(sys_chmod)
.long SYMBOL_NAME(sys_lchown16)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_break */
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_stat */
.long SYMBOL_NAME(sys_lseek)
/* 20 */ .long SYMBOL_NAME(sys_getpid)
.long SYMBOL_NAME(sys_mount)
.long SYMBOL_NAME(sys_oldumount) /* used by libc4 */
.long SYMBOL_NAME(sys_setuid16)
.long SYMBOL_NAME(sys_getuid16)
/* 25 */ .long SYMBOL_NAME(sys_stime)
.long SYMBOL_NAME(sys_ptrace)
.long SYMBOL_NAME(sys_alarm) /* used by libc4 */
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_fstat */
.long SYMBOL_NAME(sys_pause)
/* 30 */ .long SYMBOL_NAME(sys_utime) /* used by libc4 */
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_stty */
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_getty */
.long SYMBOL_NAME(sys_access)
.long SYMBOL_NAME(sys_nice)
/* 35 */ .long SYMBOL_NAME(sys_ni_syscall) /* was sys_ftime */
.long SYMBOL_NAME(sys_sync)
.long SYMBOL_NAME(sys_kill)
.long SYMBOL_NAME(sys_rename)
.long SYMBOL_NAME(sys_mkdir)
/* 40 */ .long SYMBOL_NAME(sys_rmdir)
.long SYMBOL_NAME(sys_dup)
.long SYMBOL_NAME(sys_pipe)
.long SYMBOL_NAME(sys_times)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_prof */
/* 45 */ .long SYMBOL_NAME(sys_brk)
.long SYMBOL_NAME(sys_setgid16)
.long SYMBOL_NAME(sys_getgid16)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_signal */
.long SYMBOL_NAME(sys_geteuid16)
/* 50 */ .long SYMBOL_NAME(sys_getegid16)
.long SYMBOL_NAME(sys_acct)
.long SYMBOL_NAME(sys_umount)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_lock */
.long SYMBOL_NAME(sys_ioctl)
/* 55 */ .long SYMBOL_NAME(sys_fcntl)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_mpx */
.long SYMBOL_NAME(sys_setpgid)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_ulimit */
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_olduname */
/* 60 */ .long SYMBOL_NAME(sys_umask)
.long SYMBOL_NAME(sys_chroot)
.long SYMBOL_NAME(sys_ustat)
.long SYMBOL_NAME(sys_dup2)
.long SYMBOL_NAME(sys_getppid)
/* 65 */ .long SYMBOL_NAME(sys_getpgrp)
.long SYMBOL_NAME(sys_setsid)
.long SYMBOL_NAME(sys_sigaction)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_sgetmask */
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_ssetmask */
/* 70 */ .long SYMBOL_NAME(sys_setreuid16)
.long SYMBOL_NAME(sys_setregid16)
.long SYMBOL_NAME(sys_sigsuspend)
.long SYMBOL_NAME(sys_sigpending)
.long SYMBOL_NAME(sys_sethostname)
/* 75 */ .long SYMBOL_NAME(sys_setrlimit)
.long SYMBOL_NAME(sys_old_getrlimit) /* used by libc4 */
.long SYMBOL_NAME(sys_getrusage)
.long SYMBOL_NAME(sys_gettimeofday)
.long SYMBOL_NAME(sys_settimeofday)
/* 80 */ .long SYMBOL_NAME(sys_getgroups16)
.long SYMBOL_NAME(sys_setgroups16)
.long SYMBOL_NAME(old_select) /* used by libc4 */
.long SYMBOL_NAME(sys_symlink)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_lstat */
/* 85 */ .long SYMBOL_NAME(sys_readlink)
.long SYMBOL_NAME(sys_uselib)
.long SYMBOL_NAME(sys_swapon)
.long SYMBOL_NAME(sys_reboot)
.long SYMBOL_NAME(sys_old_readdir) /* used by libc4 */
/* 90 */ .long SYMBOL_NAME(old_mmap) /* used by libc4 */
.long SYMBOL_NAME(sys_arc_munmap)
.long SYMBOL_NAME(sys_truncate)
.long SYMBOL_NAME(sys_ftruncate)
.long SYMBOL_NAME(sys_fchmod)
/* 95 */ .long SYMBOL_NAME(sys_fchown16)
.long SYMBOL_NAME(sys_getpriority)
.long SYMBOL_NAME(sys_setpriority)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_profil */
.long SYMBOL_NAME(sys_statfs)
/* 100 */ .long SYMBOL_NAME(sys_fstatfs)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_socketcall)
.long SYMBOL_NAME(sys_syslog)
.long SYMBOL_NAME(sys_setitimer)
/* 105 */ .long SYMBOL_NAME(sys_getitimer)
.long SYMBOL_NAME(sys_newstat)
.long SYMBOL_NAME(sys_newlstat)
.long SYMBOL_NAME(sys_newfstat)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_uname */
/* 110 */ .long SYMBOL_NAME(sys_ni_syscall) /* was sys_iopl */
.long SYMBOL_NAME(sys_vhangup)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_ni_syscall) /* vm86old for i386 */
.long SYMBOL_NAME(sys_wait4)
/* 115 */ .long SYMBOL_NAME(sys_swapoff)
.long SYMBOL_NAME(sys_sysinfo)
.long SYMBOL_NAME(sys_ipc)
.long SYMBOL_NAME(sys_fsync)
.long SYMBOL_NAME(sys_sigreturn)
/* 120 */ .long SYMBOL_NAME(sys_clone_wrapper)
.long SYMBOL_NAME(sys_setdomainname)
.long SYMBOL_NAME(sys_newuname)
.long SYMBOL_NAME(sys_cacheflush)
.long SYMBOL_NAME(sys_adjtimex)
/* 125 */ .long SYMBOL_NAME(sys_mprotect)
.long SYMBOL_NAME(sys_sigprocmask)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_init_module)
.long SYMBOL_NAME(sys_delete_module)
/* 130 */ .long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_quotactl)
.long SYMBOL_NAME(sys_getpgid)
.long SYMBOL_NAME(sys_fchdir)
.long SYMBOL_NAME(sys_bdflush)
/* 135 */ .long SYMBOL_NAME(sys_sysfs)
.long SYMBOL_NAME(sys_personality)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_setfsuid16)
.long SYMBOL_NAME(sys_setfsgid16)
/* 140 */ .long SYMBOL_NAME(sys_llseek)
.long SYMBOL_NAME(sys_getdents)
.long SYMBOL_NAME(sys_select)
.long SYMBOL_NAME(sys_flock)
.long SYMBOL_NAME(sys_msync)
/* 145 */ .long SYMBOL_NAME(sys_readv)
.long SYMBOL_NAME(sys_writev)
.long SYMBOL_NAME(sys_getsid)
.long SYMBOL_NAME(sys_fdatasync)
.long SYMBOL_NAME(sys_sysctl)
/* 150 */ .long SYMBOL_NAME(sys_mlock)
.long SYMBOL_NAME(sys_munlock)
.long SYMBOL_NAME(sys_mlockall)
.long SYMBOL_NAME(sys_munlockall)
.long SYMBOL_NAME(sys_sched_setparam)
/* 155 */ .long SYMBOL_NAME(sys_sched_getparam)
.long SYMBOL_NAME(sys_sched_setscheduler)
.long SYMBOL_NAME(sys_sched_getscheduler)
.long SYMBOL_NAME(sys_sched_yield)
.long SYMBOL_NAME(sys_sched_get_priority_max)
/* 160 */ .long SYMBOL_NAME(sys_sched_get_priority_min)
.long SYMBOL_NAME(sys_sched_rr_get_interval)
.long SYMBOL_NAME(sys_nanosleep)
.long SYMBOL_NAME(sys_mremap)
.long SYMBOL_NAME(sys_setresuid16)
/* 165 */ .long SYMBOL_NAME(sys_getresuid16)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_poll)
.long SYMBOL_NAME(sys_nfsservctl)
/* 170 */ .long SYMBOL_NAME(sys_setresgid16)
.long SYMBOL_NAME(sys_getresgid16)
.long SYMBOL_NAME(sys_prctl)
.long SYMBOL_NAME(sys_rt_sigreturn)
.long SYMBOL_NAME(sys_rt_sigaction)
/* 175 */ .long SYMBOL_NAME(sys_rt_sigprocmask)
.long SYMBOL_NAME(sys_rt_sigpending)
.long SYMBOL_NAME(sys_rt_sigtimedwait)
.long SYMBOL_NAME(sys_rt_sigqueueinfo)
.long SYMBOL_NAME(sys_rt_sigsuspend)
/* 180 */ .long SYMBOL_NAME(sys_pread64)
.long SYMBOL_NAME(sys_pwrite64)
.long SYMBOL_NAME(sys_chown16)
.long SYMBOL_NAME(sys_getcwd)
.long SYMBOL_NAME(sys_capget)
/* 185 */ .long SYMBOL_NAME(sys_capset)
.long SYMBOL_NAME(sys_sigaltstack)
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_ni_syscall)
/* 190 */ .long SYMBOL_NAME(sys_vfork_wrapper)
.long SYMBOL_NAME(sys_getrlimit)
.long SYMBOL_NAME(sys_mmap2)
.long SYMBOL_NAME(sys_truncate64)
.long SYMBOL_NAME(sys_ftruncate64)
/* 195 */ .long SYMBOL_NAME(sys_stat64)
.long SYMBOL_NAME(sys_lstat64)
.long SYMBOL_NAME(sys_fstat64)
.long SYMBOL_NAME(sys_lchown)
.long SYMBOL_NAME(sys_getuid)
/* 200 */ .long SYMBOL_NAME(sys_getgid)
.long SYMBOL_NAME(sys_geteuid)
.long SYMBOL_NAME(sys_getegid)
.long SYMBOL_NAME(sys_setreuid)
.long SYMBOL_NAME(sys_setregid)
/* 205 */ .long SYMBOL_NAME(sys_getgroups)
.long SYMBOL_NAME(sys_setgroups)
.long SYMBOL_NAME(sys_fchown)
.long SYMBOL_NAME(sys_setresuid)
.long SYMBOL_NAME(sys_getresuid)
/* 210 */ .long SYMBOL_NAME(sys_setresgid)
.long SYMBOL_NAME(sys_getresgid)
.long SYMBOL_NAME(sys_chown)
.long SYMBOL_NAME(sys_setuid)
.long SYMBOL_NAME(sys_setgid)
/* 215 */ .long SYMBOL_NAME(sys_setfsuid)
.long SYMBOL_NAME(sys_setfsgid)
.long SYMBOL_NAME(sys_pivot_root)
.long SYMBOL_NAME(sys_mincore)
.long SYMBOL_NAME(sys_madvise)
/* 220 */ .long SYMBOL_NAME(sys_getdents64)
.long SYMBOL_NAME(sys_fcntl64)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_gettid)
/* 225 */ .long SYMBOL_NAME(sys_lookup_dcookie)
.long SYMBOL_NAME(sys_statfs64)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_waitpid */
.long SYMBOL_NAME(sys_mq_open)
.long SYMBOL_NAME(sys_mq_unlink)
/* 230 */ .long SYMBOL_NAME(sys_mq_timedreceive)
.long SYMBOL_NAME(sys_mq_notify)
.long SYMBOL_NAME(sys_mq_getsetattr)
.long SYMBOL_NAME(sys_mq_timedsend)
.long SYMBOL_NAME(sys_timer_create)
/* 235 */ .long SYMBOL_NAME(sys_timer_settime)
.long SYMBOL_NAME(sys_timer_gettime)
.long SYMBOL_NAME(sys_timer_getoverrun)
.long SYMBOL_NAME(sys_timer_delete)
.long SYMBOL_NAME(sys_clock_settime)
/* 240 */ .long SYMBOL_NAME(sys_clock_gettime)
.long SYMBOL_NAME(sys_clock_getres)
.long SYMBOL_NAME(sys_clock_nanosleep)
.long SYMBOL_NAME(sys_sched_setaffinity)
.long SYMBOL_NAME(sys_sched_getaffinity)
/* 245 */ .long SYMBOL_NAME(sys_waitid)
.long SYMBOL_NAME(sys_restart_syscall)
.long SYMBOL_NAME(sys_pread64)
.long SYMBOL_NAME(sys_pwrite64)
.long SYMBOL_NAME(sys_mincore)
/* 250 */ .long SYMBOL_NAME(sys_madvise)
.long SYMBOL_NAME(sys_readahead)
.long SYMBOL_NAME(sys_setxattr)
.long SYMBOL_NAME(sys_lsetxattr)
.long SYMBOL_NAME(sys_fsetxattr)
/* 255 */ .long SYMBOL_NAME(sys_getxattr)
.long SYMBOL_NAME(sys_lgetxattr)
.long SYMBOL_NAME(sys_fgetxattr)
.long SYMBOL_NAME(sys_listxattr)
.long SYMBOL_NAME(sys_llistxattr)
/* 260 */ .long SYMBOL_NAME(sys_flistxattr)
.long SYMBOL_NAME(sys_removexattr)
.long SYMBOL_NAME(sys_lremovexattr)
.long SYMBOL_NAME(sys_fremovexattr)
.long SYMBOL_NAME(sys_tkill)
/* 265 */ .long SYMBOL_NAME(sys_sendfile64)
.long SYMBOL_NAME(sys_futex)
.long SYMBOL_NAME(sys_io_setup)
.long SYMBOL_NAME(sys_io_destroy)
.long SYMBOL_NAME(sys_io_getevents)
/* 270 */ .long SYMBOL_NAME(sys_io_submit)
.long SYMBOL_NAME(sys_io_cancel)
.long SYMBOL_NAME(sys_ni_syscall) /* was sys_fadvise64 */
.long SYMBOL_NAME(sys_exit_group)
.long SYMBOL_NAME(sys_epoll_create)
/* 275 */ .long SYMBOL_NAME(sys_epoll_ctl)
.long SYMBOL_NAME(sys_epoll_wait)
.long SYMBOL_NAME(sys_remap_file_pages)
.long SYMBOL_NAME(sys_set_tid_address)
.long SYMBOL_NAME(sys_fstatfs64)
/* 280 */ .long SYMBOL_NAME(sys_tgkill)
.long SYMBOL_NAME(sys_utimes)
.long SYMBOL_NAME(sys_fadvise64_64)
.long SYMBOL_NAME(sys_mbind)
.long SYMBOL_NAME(sys_get_mempolicy)
/* 285 */ .long SYMBOL_NAME(sys_set_mempolicy)
.long SYMBOL_NAME(sys_kexec_load)
.long SYMBOL_NAME(sys_add_key)
.long SYMBOL_NAME(sys_request_key)
.long SYMBOL_NAME(sys_keyctl)
/* 290 */ .long SYMBOL_NAME(sys_ioprio_set)
.long SYMBOL_NAME(sys_ioprio_get)
.long SYMBOL_NAME(sys_inotify_init)
.long SYMBOL_NAME(sys_inotify_add_watch)
.long SYMBOL_NAME(sys_inotify_rm_watch)
/* 295 */ .long SYMBOL_NAME(sys_migrate_pages)
.long SYMBOL_NAME(sys_openat)
.long SYMBOL_NAME(sys_mkdirat)
.long SYMBOL_NAME(sys_mknodat)
.long SYMBOL_NAME(sys_fchownat)
/* 300 */ .long SYMBOL_NAME(sys_futimesat)
.long SYMBOL_NAME(sys_fstatat64)
.long SYMBOL_NAME(sys_unlinkat)
.long SYMBOL_NAME(sys_renameat)
.long SYMBOL_NAME(sys_linkat)
/* 305 */ .long SYMBOL_NAME(sys_symlinkat)
.long SYMBOL_NAME(sys_readlinkat)
.long SYMBOL_NAME(sys_fchmodat)
.long SYMBOL_NAME(sys_faccessat)
.long SYMBOL_NAME(sys_pselect6)
/* 310 */ .long SYMBOL_NAME(sys_ppoll)
.long SYMBOL_NAME(sys_unshare)
.long SYMBOL_NAME(sys_set_robust_list)
.long SYMBOL_NAME(sys_get_robust_list)
.long SYMBOL_NAME(sys_splice)
/* 315 */ .long SYMBOL_NAME(sys_sync_file_range)
.long SYMBOL_NAME(sys_tee)
.long SYMBOL_NAME(sys_vmsplice)
.long SYMBOL_NAME(sys_move_pages)
.long SYMBOL_NAME(sys_getcpu)
/* 320 */ .long SYMBOL_NAME(sys_epoll_pwait)
.long SYMBOL_NAME(sys_utimensat)
.long SYMBOL_NAME(sys_signalfd)
.long SYMBOL_NAME(sys_timerfd_create)
.long SYMBOL_NAME(sys_eventfd)
/* 325 */ .long SYMBOL_NAME(sys_fallocate)
.long SYMBOL_NAME(sys_timerfd_settime)
.long SYMBOL_NAME(sys_timerfd_gettime)
.long SYMBOL_NAME(sys_signalfd4)
.long SYMBOL_NAME(sys_eventfd2)
/* 330 */ .long SYMBOL_NAME(sys_epoll_create1)
.long SYMBOL_NAME(sys_dup3)
.long SYMBOL_NAME(sys_pipe2)
.long SYMBOL_NAME(sys_inotify_init1)
.long SYMBOL_NAME(sys_preadv)
/* 335 */ .long SYMBOL_NAME(sys_pwritev)
.long SYMBOL_NAME(sys_socket)
.long SYMBOL_NAME(sys_bind)
.long SYMBOL_NAME(sys_connect)
.long SYMBOL_NAME(sys_listen)
/*340*/ .long SYMBOL_NAME(sys_accept)
.long SYMBOL_NAME(sys_getsockname)
.long SYMBOL_NAME(sys_getpeername)
.long SYMBOL_NAME(sys_socketpair)
.long SYMBOL_NAME(sys_send)
/*345*/ .long SYMBOL_NAME(sys_sendto)
.long SYMBOL_NAME(sys_recv)
.long SYMBOL_NAME(sys_recvfrom)
.long SYMBOL_NAME(sys_shutdown)
.long SYMBOL_NAME(sys_setsockopt)
/*350*/ .long SYMBOL_NAME(sys_getsockopt)
.long SYMBOL_NAME(sys_sendmsg)
.long SYMBOL_NAME(sys_recvmsg)
.long SYMBOL_NAME(sys_arc_settls)
.long SYMBOL_NAME(sys_arc_gettls)
__syscall_end:
.rept NR_syscalls - (__syscall_end - __syscall_start) / 4
.long SYMBOL_NAME(sys_ni_syscall)
.endr
ARC_EXIT sys_call_table
#ifdef CONFIG_ARC_STACK_UNWIND
; Workaround for bug 94179 (STAR ):
; Despite -fasynchronous-unwind-tables, linker is not making dwarf2 unwinder
; section (.debug_frame) as loadable. So we force it here.
; This also fixes STAR 9000487933 where the prev-workaround (objcopy --setflag)
; would not work after a clean build due to kernel build system dependencies.
.section .debug_frame, "wa",@progbits
#endif