1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 29d42c84fSVineet Gupta /* 36d1a20b1SVineet Gupta * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com) 49d42c84fSVineet Gupta * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 59d42c84fSVineet Gupta */ 69d42c84fSVineet Gupta 79d42c84fSVineet Gupta #ifndef __ASM_ARC_ENTRY_H 89d42c84fSVineet Gupta #define __ASM_ARC_ENTRY_H 99d42c84fSVineet Gupta 10*ebfc2fd8SBjorn Helgaas #include <asm/unistd.h> /* For NR_syscalls definition */ 119d42c84fSVineet Gupta #include <asm/arcregs.h> 129d42c84fSVineet Gupta #include <asm/ptrace.h> 13080c3747SVineet Gupta #include <asm/processor.h> /* For VMALLOC_START */ 144ffd9e2cSVineet Gupta #include <asm/mmu.h> 159d42c84fSVineet Gupta 164d369680SVineet Gupta #ifdef __ASSEMBLY__ 174d369680SVineet Gupta 181f6ccfffSVineet Gupta #ifdef CONFIG_ISA_ARCOMPACT 196d1a20b1SVineet Gupta #include <asm/entry-compact.h> /* ISA specific bits */ 201f6ccfffSVineet Gupta #else 211f6ccfffSVineet Gupta #include <asm/entry-arcv2.h> 221f6ccfffSVineet Gupta #endif 236d1a20b1SVineet Gupta 24cfca4b5aSVineet Gupta /* 25cfca4b5aSVineet Gupta * save user mode callee regs as struct callee_regs 26cfca4b5aSVineet Gupta * - needed by fork/do_signal/unaligned-access-emulation. 27cfca4b5aSVineet Gupta */ 289d42c84fSVineet Gupta .macro SAVE_CALLEE_SAVED_USER 299de7fc30SVineet Gupta SAVE_ABI_CALLEE_REGS 309d42c84fSVineet Gupta .endm 319d42c84fSVineet Gupta 32cfca4b5aSVineet Gupta /* 33cfca4b5aSVineet Gupta * restore user mode callee regs as struct callee_regs 34cfca4b5aSVineet Gupta * - could have been changed by ptrace tracer or unaligned-access fixup 35cfca4b5aSVineet Gupta */ 36c3581039SVineet Gupta .macro RESTORE_CALLEE_SAVED_USER 379de7fc30SVineet Gupta RESTORE_ABI_CALLEE_REGS 38cfca4b5aSVineet Gupta .endm 39c3581039SVineet Gupta 40cfca4b5aSVineet Gupta /* 41cfca4b5aSVineet Gupta * save/restore kernel mode callee regs at the time of context switch 42cfca4b5aSVineet Gupta */ 43cfca4b5aSVineet Gupta .macro SAVE_CALLEE_SAVED_KERNEL 449de7fc30SVineet Gupta SAVE_ABI_CALLEE_REGS 45cfca4b5aSVineet Gupta .endm 460d7b8855SVineet Gupta 47cfca4b5aSVineet Gupta .macro RESTORE_CALLEE_SAVED_KERNEL 489de7fc30SVineet Gupta RESTORE_ABI_CALLEE_REGS 49c3581039SVineet Gupta .endm 50c3581039SVineet Gupta 51c3581039SVineet Gupta /*-------------------------------------------------------------- 529d42c84fSVineet Gupta * Super FAST Restore callee saved regs by simply re-adjusting SP 539d42c84fSVineet Gupta *-------------------------------------------------------------*/ 549d42c84fSVineet Gupta .macro DISCARD_CALLEE_SAVED_USER 5516f9afe6SVineet Gupta add sp, sp, SZ_CALLEE_REGS 569d42c84fSVineet Gupta .endm 579d42c84fSVineet Gupta 589d42c84fSVineet Gupta /*------------------------------------------------------------- 59*ebfc2fd8SBjorn Helgaas * given a tsk struct, get to the base of its kernel mode stack 609d42c84fSVineet Gupta * tsk->thread_info is really a PAGE, whose bottom hoists stack 619d42c84fSVineet Gupta * which grows upwards towards thread_info 629d42c84fSVineet Gupta *------------------------------------------------------------*/ 639d42c84fSVineet Gupta 649d42c84fSVineet Gupta .macro GET_TSK_STACK_BASE tsk, out 659d42c84fSVineet Gupta 669d42c84fSVineet Gupta /* Get task->thread_info (this is essentially start of a PAGE) */ 679d42c84fSVineet Gupta ld \out, [\tsk, TASK_THREAD_INFO] 689d42c84fSVineet Gupta 699d42c84fSVineet Gupta /* Go to end of page where stack begins (grows upwards) */ 70283237a0SVineet Gupta add2 \out, \out, (THREAD_SIZE)/4 719d42c84fSVineet Gupta 729d42c84fSVineet Gupta .endm 739d42c84fSVineet Gupta 749d42c84fSVineet Gupta /* 759d42c84fSVineet Gupta * @reg [OUT] thread_info->flags of "current" 769d42c84fSVineet Gupta */ 779d42c84fSVineet Gupta .macro GET_CURR_THR_INFO_FLAGS reg 789d42c84fSVineet Gupta GET_CURR_THR_INFO_FROM_SP \reg 799d42c84fSVineet Gupta ld \reg, [\reg, THREAD_INFO_FLAGS] 809d42c84fSVineet Gupta .endm 819d42c84fSVineet Gupta 8241195d23SVineet Gupta #ifdef CONFIG_SMP 8341195d23SVineet Gupta 84cfca4b5aSVineet Gupta /* 8541195d23SVineet Gupta * Retrieve the current running task on this CPU 86cfca4b5aSVineet Gupta * - loads it from backing _current_task[] (and can't use the 87cfca4b5aSVineet Gupta * caching reg for current task 8841195d23SVineet Gupta */ 8941195d23SVineet Gupta .macro GET_CURR_TASK_ON_CPU reg 9041195d23SVineet Gupta GET_CPU_ID \reg 9141195d23SVineet Gupta ld.as \reg, [@_current_task, \reg] 9241195d23SVineet Gupta .endm 9341195d23SVineet Gupta 9441195d23SVineet Gupta /*------------------------------------------------- 9541195d23SVineet Gupta * Save a new task as the "current" task on this CPU 9641195d23SVineet Gupta * 1. Determine curr CPU id. 9741195d23SVineet Gupta * 2. Use it to index into _current_task[ ] 9841195d23SVineet Gupta * 9941195d23SVineet Gupta * Coded differently than GET_CURR_TASK_ON_CPU (which uses LD.AS) 10041195d23SVineet Gupta * because ST r0, [r1, offset] can ONLY have s9 @offset 10141195d23SVineet Gupta * while LD can take s9 (4 byte insn) or LIMM (8 byte insn) 10241195d23SVineet Gupta */ 10341195d23SVineet Gupta 10441195d23SVineet Gupta .macro SET_CURR_TASK_ON_CPU tsk, tmp 10541195d23SVineet Gupta GET_CPU_ID \tmp 10641195d23SVineet Gupta add2 \tmp, @_current_task, \tmp 10741195d23SVineet Gupta st \tsk, [\tmp] 10841195d23SVineet Gupta #ifdef CONFIG_ARC_CURR_IN_REG 109cfca4b5aSVineet Gupta mov gp, \tsk 11041195d23SVineet Gupta #endif 11141195d23SVineet Gupta 11241195d23SVineet Gupta .endm 11341195d23SVineet Gupta 11441195d23SVineet Gupta 11541195d23SVineet Gupta #else /* Uniprocessor implementation of macros */ 11641195d23SVineet Gupta 1179d42c84fSVineet Gupta .macro GET_CURR_TASK_ON_CPU reg 1189d42c84fSVineet Gupta ld \reg, [@_current_task] 1199d42c84fSVineet Gupta .endm 1209d42c84fSVineet Gupta 1219d42c84fSVineet Gupta .macro SET_CURR_TASK_ON_CPU tsk, tmp 1229d42c84fSVineet Gupta st \tsk, [@_current_task] 123080c3747SVineet Gupta #ifdef CONFIG_ARC_CURR_IN_REG 124cfca4b5aSVineet Gupta mov gp, \tsk 125080c3747SVineet Gupta #endif 1269d42c84fSVineet Gupta .endm 1279d42c84fSVineet Gupta 12841195d23SVineet Gupta #endif /* SMP / UNI */ 12941195d23SVineet Gupta 130cfca4b5aSVineet Gupta /* 1319d42c84fSVineet Gupta * Get the ptr to some field of Current Task at @off in task struct 132cfca4b5aSVineet Gupta * - Uses current task cached in reg if enabled 1339d42c84fSVineet Gupta */ 134080c3747SVineet Gupta #ifdef CONFIG_ARC_CURR_IN_REG 135080c3747SVineet Gupta 136080c3747SVineet Gupta .macro GET_CURR_TASK_FIELD_PTR off, reg 137cfca4b5aSVineet Gupta add \reg, gp, \off 138080c3747SVineet Gupta .endm 139080c3747SVineet Gupta 140080c3747SVineet Gupta #else 141080c3747SVineet Gupta 1429d42c84fSVineet Gupta .macro GET_CURR_TASK_FIELD_PTR off, reg 1439d42c84fSVineet Gupta GET_CURR_TASK_ON_CPU \reg 1449d42c84fSVineet Gupta add \reg, \reg, \off 1459d42c84fSVineet Gupta .endm 1469d42c84fSVineet Gupta 147080c3747SVineet Gupta #endif /* CONFIG_ARC_CURR_IN_REG */ 148080c3747SVineet Gupta 1494d369680SVineet Gupta #else /* !__ASSEMBLY__ */ 1504d369680SVineet Gupta 1514d369680SVineet Gupta extern void do_signal(struct pt_regs *); 1524d369680SVineet Gupta extern void do_notify_resume(struct pt_regs *); 1534d369680SVineet Gupta extern int do_privilege_fault(unsigned long, struct pt_regs *); 1544d369680SVineet Gupta extern int do_extension_fault(unsigned long, struct pt_regs *); 1554d369680SVineet Gupta extern int insterror_is_error(unsigned long, struct pt_regs *); 1564d369680SVineet Gupta extern int do_memory_error(unsigned long, struct pt_regs *); 1574d369680SVineet Gupta extern int trap_is_brkpt(unsigned long, struct pt_regs *); 1584d369680SVineet Gupta extern int do_misaligned_error(unsigned long, struct pt_regs *); 1594d369680SVineet Gupta extern int do_trap5_error(unsigned long, struct pt_regs *); 1604d369680SVineet Gupta extern int do_misaligned_access(unsigned long, struct pt_regs *, struct callee_regs *); 1614d369680SVineet Gupta extern void do_machine_check_fault(unsigned long, struct pt_regs *); 1624d369680SVineet Gupta extern void do_non_swi_trap(unsigned long, struct pt_regs *); 1634d369680SVineet Gupta extern void do_insterror_or_kprobe(unsigned long, struct pt_regs *); 1644d369680SVineet Gupta extern void do_page_fault(unsigned long, struct pt_regs *); 1654d369680SVineet Gupta 1664d369680SVineet Gupta #endif 1674d369680SVineet Gupta 1689d42c84fSVineet Gupta #endif /* __ASM_ARC_ENTRY_H */ 169