Linux Audio

Check our new training course

Loading...
v6.8
  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 */
v6.13.7
  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 definition */
 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 its 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 */