xref: /openbmc/linux/arch/riscv/include/asm/processor.h (revision 2d594783)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2012 Regents of the University of California
4  */
5 
6 #ifndef _ASM_RISCV_PROCESSOR_H
7 #define _ASM_RISCV_PROCESSOR_H
8 
9 #include <linux/const.h>
10 #include <linux/cache.h>
11 
12 #include <vdso/processor.h>
13 
14 #include <asm/ptrace.h>
15 
16 /*
17  * This decides where the kernel will search for a free chunk of vm
18  * space during mmap's.
19  */
20 #define TASK_UNMAPPED_BASE	PAGE_ALIGN(TASK_SIZE / 3)
21 
22 #define STACK_TOP		TASK_SIZE
23 #ifdef CONFIG_64BIT
24 #define STACK_TOP_MAX		TASK_SIZE_64
25 #else
26 #define STACK_TOP_MAX		TASK_SIZE
27 #endif
28 #define STACK_ALIGN		16
29 
30 #ifndef __ASSEMBLY__
31 
32 struct task_struct;
33 struct pt_regs;
34 
35 /* CPU-specific state of a task */
36 struct thread_struct {
37 	/* Callee-saved registers */
38 	unsigned long ra;
39 	unsigned long sp;	/* Kernel mode stack */
40 	unsigned long s[12];	/* s[0]: frame pointer */
41 	struct __riscv_d_ext_state fstate;
42 	unsigned long bad_cause;
43 	unsigned long vstate_ctrl;
44 	struct __riscv_v_ext_state vstate;
45 };
46 
47 /* Whitelist the fstate from the task_struct for hardened usercopy */
48 static inline void arch_thread_struct_whitelist(unsigned long *offset,
49 						unsigned long *size)
50 {
51 	*offset = offsetof(struct thread_struct, fstate);
52 	*size = sizeof_field(struct thread_struct, fstate);
53 }
54 
55 #define INIT_THREAD {					\
56 	.sp = sizeof(init_stack) + (long)&init_stack,	\
57 }
58 
59 #define task_pt_regs(tsk)						\
60 	((struct pt_regs *)(task_stack_page(tsk) + THREAD_SIZE		\
61 			    - ALIGN(sizeof(struct pt_regs), STACK_ALIGN)))
62 
63 #define KSTK_EIP(tsk)		(task_pt_regs(tsk)->epc)
64 #define KSTK_ESP(tsk)		(task_pt_regs(tsk)->sp)
65 
66 
67 /* Do necessary setup to start up a newly executed thread. */
68 extern void start_thread(struct pt_regs *regs,
69 			unsigned long pc, unsigned long sp);
70 
71 extern unsigned long __get_wchan(struct task_struct *p);
72 
73 
74 static inline void wait_for_interrupt(void)
75 {
76 	__asm__ __volatile__ ("wfi");
77 }
78 
79 struct device_node;
80 int riscv_of_processor_hartid(struct device_node *node, unsigned long *hartid);
81 int riscv_early_of_processor_hartid(struct device_node *node, unsigned long *hartid);
82 int riscv_of_parent_hartid(struct device_node *node, unsigned long *hartid);
83 
84 extern void riscv_fill_hwcap(void);
85 extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
86 
87 extern unsigned long signal_minsigstksz __ro_after_init;
88 
89 #ifdef CONFIG_RISCV_ISA_V
90 /* Userspace interface for PR_RISCV_V_{SET,GET}_VS prctl()s: */
91 #define RISCV_V_SET_CONTROL(arg)	riscv_v_vstate_ctrl_set_current(arg)
92 #define RISCV_V_GET_CONTROL()		riscv_v_vstate_ctrl_get_current()
93 extern long riscv_v_vstate_ctrl_set_current(unsigned long arg);
94 extern long riscv_v_vstate_ctrl_get_current(void);
95 #endif /* CONFIG_RISCV_ISA_V */
96 
97 #endif /* __ASSEMBLY__ */
98 
99 #endif /* _ASM_RISCV_PROCESSOR_H */
100