1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2012 Regents of the University of California 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _ASM_RISCV_PROCESSOR_H 7*4882a593Smuzhiyun #define _ASM_RISCV_PROCESSOR_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/const.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <vdso/processor.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <asm/ptrace.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyun * This decides where the kernel will search for a free chunk of vm 17*4882a593Smuzhiyun * space during mmap's. 18*4882a593Smuzhiyun */ 19*4882a593Smuzhiyun #define TASK_UNMAPPED_BASE PAGE_ALIGN(TASK_SIZE / 3) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define STACK_TOP TASK_SIZE 22*4882a593Smuzhiyun #define STACK_TOP_MAX STACK_TOP 23*4882a593Smuzhiyun #define STACK_ALIGN 16 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun struct task_struct; 28*4882a593Smuzhiyun struct pt_regs; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* CPU-specific state of a task */ 31*4882a593Smuzhiyun struct thread_struct { 32*4882a593Smuzhiyun /* Callee-saved registers */ 33*4882a593Smuzhiyun unsigned long ra; 34*4882a593Smuzhiyun unsigned long sp; /* Kernel mode stack */ 35*4882a593Smuzhiyun unsigned long s[12]; /* s[0]: frame pointer */ 36*4882a593Smuzhiyun struct __riscv_d_ext_state fstate; 37*4882a593Smuzhiyun }; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define INIT_THREAD { \ 40*4882a593Smuzhiyun .sp = sizeof(init_stack) + (long)&init_stack, \ 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define task_pt_regs(tsk) \ 44*4882a593Smuzhiyun ((struct pt_regs *)(task_stack_page(tsk) + THREAD_SIZE \ 45*4882a593Smuzhiyun - ALIGN(sizeof(struct pt_regs), STACK_ALIGN))) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #define KSTK_EIP(tsk) (task_pt_regs(tsk)->epc) 48*4882a593Smuzhiyun #define KSTK_ESP(tsk) (task_pt_regs(tsk)->sp) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* Do necessary setup to start up a newly executed thread. */ 52*4882a593Smuzhiyun extern void start_thread(struct pt_regs *regs, 53*4882a593Smuzhiyun unsigned long pc, unsigned long sp); 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* Free all resources held by a thread. */ release_thread(struct task_struct * dead_task)56*4882a593Smuzhiyunstatic inline void release_thread(struct task_struct *dead_task) 57*4882a593Smuzhiyun { 58*4882a593Smuzhiyun } 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun extern unsigned long get_wchan(struct task_struct *p); 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun wait_for_interrupt(void)63*4882a593Smuzhiyunstatic inline void wait_for_interrupt(void) 64*4882a593Smuzhiyun { 65*4882a593Smuzhiyun __asm__ __volatile__ ("wfi"); 66*4882a593Smuzhiyun } 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun struct device_node; 69*4882a593Smuzhiyun int riscv_of_processor_hartid(struct device_node *node); 70*4882a593Smuzhiyun int riscv_of_parent_hartid(struct device_node *node); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun extern void riscv_fill_hwcap(void); 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */ 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #endif /* _ASM_RISCV_PROCESSOR_H */ 77