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