xref: /openbmc/linux/arch/arc/include/asm/processor.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
23be80aaeSVineet Gupta /*
33be80aaeSVineet Gupta  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
43be80aaeSVineet Gupta  *
53be80aaeSVineet Gupta  * vineetg: March 2009
63be80aaeSVineet Gupta  *  -Implemented task_pt_regs( )
73be80aaeSVineet Gupta  *
83be80aaeSVineet Gupta  * Amit Bhor, Sameer Dhavale, Ashwin Chaugule: Codito Technologies 2004
93be80aaeSVineet Gupta  */
103be80aaeSVineet Gupta 
113be80aaeSVineet Gupta #ifndef __ASM_ARC_PROCESSOR_H
123be80aaeSVineet Gupta #define __ASM_ARC_PROCESSOR_H
133be80aaeSVineet Gupta 
143be80aaeSVineet Gupta #ifndef __ASSEMBLY__
153be80aaeSVineet Gupta 
1616f9afe6SVineet Gupta #include <asm/ptrace.h>
177321e2eaSEugeniy Paltsev #include <asm/dsp.h>
18f05523aaSVineet Gupta #include <asm/fpu.h>
1952e9bae9SVineet Gupta 
203be80aaeSVineet Gupta /* Arch specific stuff which needs to be saved per task.
213be80aaeSVineet Gupta  * However these items are not so important so as to earn a place in
223be80aaeSVineet Gupta  * struct thread_info
233be80aaeSVineet Gupta  */
243be80aaeSVineet Gupta struct thread_struct {
253be80aaeSVineet Gupta 	unsigned long callee_reg;	/* pointer to callee regs */
263be80aaeSVineet Gupta 	unsigned long fault_address;	/* dbls as brkpt holder as well */
277321e2eaSEugeniy Paltsev #ifdef CONFIG_ARC_DSP_SAVE_RESTORE_REGS
287321e2eaSEugeniy Paltsev 	struct dsp_callee_regs dsp;
297321e2eaSEugeniy Paltsev #endif
30bf90e1eaSVineet Gupta #ifdef CONFIG_ARC_FPU_SAVE_RESTORE
31bf90e1eaSVineet Gupta 	struct arc_fpu fpu;
32bf90e1eaSVineet Gupta #endif
333be80aaeSVineet Gupta };
343be80aaeSVineet Gupta 
35d1d1569eSVineet Gupta #define INIT_THREAD  { }
363be80aaeSVineet Gupta 
373be80aaeSVineet Gupta /* Forward declaration, a strange C thing */
383be80aaeSVineet Gupta struct task_struct;
393be80aaeSVineet Gupta 
403be80aaeSVineet Gupta #define task_pt_regs(p) \
41283237a0SVineet Gupta 	((struct pt_regs *)(THREAD_SIZE + (void *)task_stack_page(p)) - 1)
423be80aaeSVineet Gupta 
4341195d23SVineet Gupta /*
4441195d23SVineet Gupta  * A lot of busy-wait loops in SMP are based off of non-volatile data otherwise
4541195d23SVineet Gupta  * get optimised away by gcc
4641195d23SVineet Gupta  */
4746c3e6b8STal Zilcer #define cpu_relax()		barrier()
483a6bfbc9SDavidlohr Bueso 
493be80aaeSVineet Gupta #define KSTK_EIP(tsk)   (task_pt_regs(tsk)->ret)
5013648b01SVineet Gupta #define KSTK_ESP(tsk)   (task_pt_regs(tsk)->sp)
513be80aaeSVineet Gupta 
523be80aaeSVineet Gupta /*
532547476aSAndrea Gelmini  * Where about of Task's sp, fp, blink when it was last seen in kernel mode.
5416f9afe6SVineet Gupta  * Look in process.c for details of kernel stack layout
553be80aaeSVineet Gupta  */
56*fd476197SVineet Gupta #define TSK_K_ESP(tsk)		(task_thread_info(tsk)->ksp)
5716f9afe6SVineet Gupta 
581269f4d5SVineet Gupta #define TSK_K_REG(tsk, off)	(*((unsigned long *)(TSK_K_ESP(tsk) + \
5916f9afe6SVineet Gupta 					sizeof(struct callee_regs) + off)))
6016f9afe6SVineet Gupta 
6113648b01SVineet Gupta #define TSK_K_BLINK(tsk)	TSK_K_REG(tsk, 4)
6213648b01SVineet Gupta #define TSK_K_FP(tsk)		TSK_K_REG(tsk, 0)
633be80aaeSVineet Gupta 
642ab402dfSVineet Gupta extern void start_thread(struct pt_regs * regs, unsigned long pc,
652ab402dfSVineet Gupta 			 unsigned long usp);
663be80aaeSVineet Gupta 
6742a20f86SKees Cook extern unsigned int __get_wchan(struct task_struct *p);
683be80aaeSVineet Gupta 
693be80aaeSVineet Gupta #endif /* !__ASSEMBLY__ */
703be80aaeSVineet Gupta 
714db27dcaSVineet Gupta /*
7215ca68a9SNoam Camus  * Default System Memory Map on ARC
734db27dcaSVineet Gupta  *
744db27dcaSVineet Gupta  * ---------------------------- (lower 2G, Translated) -------------------------
754db27dcaSVineet Gupta  * 0x0000_0000		0x5FFF_FFFF	(user vaddr: TASK_SIZE)
764db27dcaSVineet Gupta  * 0x6000_0000		0x6FFF_FFFF	(reserved gutter between U/K)
774db27dcaSVineet Gupta  * 0x7000_0000		0x7FFF_FFFF	(kvaddr: vmalloc/modules/pkmap..)
784db27dcaSVineet Gupta  *
794db27dcaSVineet Gupta  * PAGE_OFFSET ---------------- (Upper 2G, Untranslated) -----------------------
804db27dcaSVineet Gupta  * 0x8000_0000		0xBFFF_FFFF	(kernel direct mapped)
814db27dcaSVineet Gupta  * 0xC000_0000		0xFFFF_FFFF	(peripheral uncached space)
824db27dcaSVineet Gupta  * -----------------------------------------------------------------------------
833be80aaeSVineet Gupta  */
8445890f6dSVineet Gupta 
8515ca68a9SNoam Camus #define TASK_SIZE	0x60000000
8615ca68a9SNoam Camus 
8715ca68a9SNoam Camus #define VMALLOC_START	(PAGE_OFFSET - (CONFIG_ARC_KVADDR_SIZE << 20))
8815ca68a9SNoam Camus 
8915ca68a9SNoam Camus /* 1 PGDIR_SIZE each for fixmap/pkmap, 2 PGDIR_SIZE gutter (see asm/highmem.h) */
902dde02abSVineet Gupta #define VMALLOC_SIZE	((CONFIG_ARC_KVADDR_SIZE << 20) - PMD_SIZE * 4)
9115ca68a9SNoam Camus 
924db27dcaSVineet Gupta #define VMALLOC_END	(VMALLOC_START + VMALLOC_SIZE)
933be80aaeSVineet Gupta 
9415ca68a9SNoam Camus #define USER_KERNEL_GUTTER    (VMALLOC_START - TASK_SIZE)
953be80aaeSVineet Gupta 
963be80aaeSVineet Gupta #define STACK_TOP       TASK_SIZE
973be80aaeSVineet Gupta #define STACK_TOP_MAX   STACK_TOP
983be80aaeSVineet Gupta 
993be80aaeSVineet Gupta /* This decides where the kernel will search for a free chunk of vm
1003be80aaeSVineet Gupta  * space during mmap's.
1013be80aaeSVineet Gupta  */
1023be80aaeSVineet Gupta #define TASK_UNMAPPED_BASE      (TASK_SIZE / 3)
1033be80aaeSVineet Gupta 
1043be80aaeSVineet Gupta #endif /* __ASM_ARC_PROCESSOR_H */
105