1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com) 4 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 5 */ 6 7#ifndef __ASM_ARC_ENTRY_H 8#define __ASM_ARC_ENTRY_H 9 10#include <asm/unistd.h> /* For NR_syscalls defination */ 11#include <asm/arcregs.h> 12#include <asm/ptrace.h> 13#include <asm/processor.h> /* For VMALLOC_START */ 14#include <asm/mmu.h> 15 16#ifdef __ASSEMBLY__ 17 18#ifdef CONFIG_ISA_ARCOMPACT 19#include <asm/entry-compact.h> /* ISA specific bits */ 20#else 21#include <asm/entry-arcv2.h> 22#endif 23 24/* 25 * save user mode callee regs as struct callee_regs 26 * - needed by fork/do_signal/unaligned-access-emulation. 27 */ 28.macro SAVE_CALLEE_SAVED_USER 29 SAVE_ABI_CALLEE_REGS 30.endm 31 32/* 33 * restore user mode callee regs as struct callee_regs 34 * - could have been changed by ptrace tracer or unaligned-access fixup 35 */ 36.macro RESTORE_CALLEE_SAVED_USER 37 RESTORE_ABI_CALLEE_REGS 38.endm 39 40/* 41 * save/restore kernel mode callee regs at the time of context switch 42 */ 43.macro SAVE_CALLEE_SAVED_KERNEL 44 SAVE_ABI_CALLEE_REGS 45.endm 46 47.macro RESTORE_CALLEE_SAVED_KERNEL 48 RESTORE_ABI_CALLEE_REGS 49.endm 50 51/*-------------------------------------------------------------- 52 * Super FAST Restore callee saved regs by simply re-adjusting SP 53 *-------------------------------------------------------------*/ 54.macro DISCARD_CALLEE_SAVED_USER 55 add sp, sp, SZ_CALLEE_REGS 56.endm 57 58/*------------------------------------------------------------- 59 * given a tsk struct, get to the base of it's kernel mode stack 60 * tsk->thread_info is really a PAGE, whose bottom hoists stack 61 * which grows upwards towards thread_info 62 *------------------------------------------------------------*/ 63 64.macro GET_TSK_STACK_BASE tsk, out 65 66 /* Get task->thread_info (this is essentially start of a PAGE) */ 67 ld \out, [\tsk, TASK_THREAD_INFO] 68 69 /* Go to end of page where stack begins (grows upwards) */ 70 add2 \out, \out, (THREAD_SIZE)/4 71 72.endm 73 74/* 75 * @reg [OUT] thread_info->flags of "current" 76 */ 77.macro GET_CURR_THR_INFO_FLAGS reg 78 GET_CURR_THR_INFO_FROM_SP \reg 79 ld \reg, [\reg, THREAD_INFO_FLAGS] 80.endm 81 82#ifdef CONFIG_SMP 83 84/* 85 * Retrieve the current running task on this CPU 86 * - loads it from backing _current_task[] (and can't use the 87 * caching reg for current task 88 */ 89.macro GET_CURR_TASK_ON_CPU reg 90 GET_CPU_ID \reg 91 ld.as \reg, [@_current_task, \reg] 92.endm 93 94/*------------------------------------------------- 95 * Save a new task as the "current" task on this CPU 96 * 1. Determine curr CPU id. 97 * 2. Use it to index into _current_task[ ] 98 * 99 * Coded differently than GET_CURR_TASK_ON_CPU (which uses LD.AS) 100 * because ST r0, [r1, offset] can ONLY have s9 @offset 101 * while LD can take s9 (4 byte insn) or LIMM (8 byte insn) 102 */ 103 104.macro SET_CURR_TASK_ON_CPU tsk, tmp 105 GET_CPU_ID \tmp 106 add2 \tmp, @_current_task, \tmp 107 st \tsk, [\tmp] 108#ifdef CONFIG_ARC_CURR_IN_REG 109 mov gp, \tsk 110#endif 111 112.endm 113 114 115#else /* Uniprocessor implementation of macros */ 116 117.macro GET_CURR_TASK_ON_CPU reg 118 ld \reg, [@_current_task] 119.endm 120 121.macro SET_CURR_TASK_ON_CPU tsk, tmp 122 st \tsk, [@_current_task] 123#ifdef CONFIG_ARC_CURR_IN_REG 124 mov gp, \tsk 125#endif 126.endm 127 128#endif /* SMP / UNI */ 129 130/* 131 * Get the ptr to some field of Current Task at @off in task struct 132 * - Uses current task cached in reg if enabled 133 */ 134#ifdef CONFIG_ARC_CURR_IN_REG 135 136.macro GET_CURR_TASK_FIELD_PTR off, reg 137 add \reg, gp, \off 138.endm 139 140#else 141 142.macro GET_CURR_TASK_FIELD_PTR off, reg 143 GET_CURR_TASK_ON_CPU \reg 144 add \reg, \reg, \off 145.endm 146 147#endif /* CONFIG_ARC_CURR_IN_REG */ 148 149#else /* !__ASSEMBLY__ */ 150 151extern void do_signal(struct pt_regs *); 152extern void do_notify_resume(struct pt_regs *); 153extern int do_privilege_fault(unsigned long, struct pt_regs *); 154extern int do_extension_fault(unsigned long, struct pt_regs *); 155extern int insterror_is_error(unsigned long, struct pt_regs *); 156extern int do_memory_error(unsigned long, struct pt_regs *); 157extern int trap_is_brkpt(unsigned long, struct pt_regs *); 158extern int do_misaligned_error(unsigned long, struct pt_regs *); 159extern int do_trap5_error(unsigned long, struct pt_regs *); 160extern int do_misaligned_access(unsigned long, struct pt_regs *, struct callee_regs *); 161extern void do_machine_check_fault(unsigned long, struct pt_regs *); 162extern void do_non_swi_trap(unsigned long, struct pt_regs *); 163extern void do_insterror_or_kprobe(unsigned long, struct pt_regs *); 164extern void do_page_fault(unsigned long, struct pt_regs *); 165 166#endif 167 168#endif /* __ASM_ARC_ENTRY_H */ 169