1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun // Copyright (C) 2005-2017 Andes Technology Corporation 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef __ASM_NDS32_PROCESSOR_H 5*4882a593Smuzhiyun #define __ASM_NDS32_PROCESSOR_H 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifdef __KERNEL__ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <asm/ptrace.h> 10*4882a593Smuzhiyun #include <asm/types.h> 11*4882a593Smuzhiyun #include <asm/sigcontext.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define KERNEL_STACK_SIZE PAGE_SIZE 14*4882a593Smuzhiyun #define STACK_TOP TASK_SIZE 15*4882a593Smuzhiyun #define STACK_TOP_MAX TASK_SIZE 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun struct cpu_context { 18*4882a593Smuzhiyun unsigned long r6; 19*4882a593Smuzhiyun unsigned long r7; 20*4882a593Smuzhiyun unsigned long r8; 21*4882a593Smuzhiyun unsigned long r9; 22*4882a593Smuzhiyun unsigned long r10; 23*4882a593Smuzhiyun unsigned long r11; 24*4882a593Smuzhiyun unsigned long r12; 25*4882a593Smuzhiyun unsigned long r13; 26*4882a593Smuzhiyun unsigned long r14; 27*4882a593Smuzhiyun unsigned long fp; 28*4882a593Smuzhiyun unsigned long pc; 29*4882a593Smuzhiyun unsigned long sp; 30*4882a593Smuzhiyun }; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun struct thread_struct { 33*4882a593Smuzhiyun struct cpu_context cpu_context; /* cpu context */ 34*4882a593Smuzhiyun /* fault info */ 35*4882a593Smuzhiyun unsigned long address; 36*4882a593Smuzhiyun unsigned long trap_no; 37*4882a593Smuzhiyun unsigned long error_code; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun struct fpu_struct fpu; 40*4882a593Smuzhiyun }; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define INIT_THREAD { } 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #ifdef __NDS32_EB__ 45*4882a593Smuzhiyun #define PSW_DE PSW_mskBE 46*4882a593Smuzhiyun #else 47*4882a593Smuzhiyun #define PSW_DE 0x0 48*4882a593Smuzhiyun #endif 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #ifdef CONFIG_WBNA 51*4882a593Smuzhiyun #define PSW_valWBNA PSW_mskWBNA 52*4882a593Smuzhiyun #else 53*4882a593Smuzhiyun #define PSW_valWBNA 0x0 54*4882a593Smuzhiyun #endif 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #ifdef CONFIG_HWZOL 57*4882a593Smuzhiyun #define PSW_valINIT (PSW_CPL_ANY | PSW_mskAEN | PSW_valWBNA | PSW_mskDT | PSW_mskIT | PSW_DE | PSW_mskGIE) 58*4882a593Smuzhiyun #else 59*4882a593Smuzhiyun #define PSW_valINIT (PSW_CPL_ANY | PSW_valWBNA | PSW_mskDT | PSW_mskIT | PSW_DE | PSW_mskGIE) 60*4882a593Smuzhiyun #endif 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define start_thread(regs,pc,stack) \ 63*4882a593Smuzhiyun ({ \ 64*4882a593Smuzhiyun memzero(regs, sizeof(struct pt_regs)); \ 65*4882a593Smuzhiyun forget_syscall(regs); \ 66*4882a593Smuzhiyun regs->ipsw = PSW_valINIT; \ 67*4882a593Smuzhiyun regs->ir0 = (PSW_CPL_ANY | PSW_valWBNA | PSW_mskDT | PSW_mskIT | PSW_DE | PSW_SYSTEM | PSW_INTL_1); \ 68*4882a593Smuzhiyun regs->ipc = pc; \ 69*4882a593Smuzhiyun regs->sp = stack; \ 70*4882a593Smuzhiyun }) 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* Forward declaration, a strange C thing */ 73*4882a593Smuzhiyun struct task_struct; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* Free all resources held by a thread. */ 76*4882a593Smuzhiyun #define release_thread(thread) do { } while(0) 77*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_FPU) 78*4882a593Smuzhiyun #if !IS_ENABLED(CONFIG_UNLAZU_FPU) 79*4882a593Smuzhiyun extern struct task_struct *last_task_used_math; 80*4882a593Smuzhiyun #endif 81*4882a593Smuzhiyun #endif 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /* Prepare to copy thread state - unlazy all lazy status */ 84*4882a593Smuzhiyun #define prepare_to_copy(tsk) do { } while (0) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun unsigned long get_wchan(struct task_struct *p); 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define cpu_relax() barrier() 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #define task_pt_regs(task) \ 91*4882a593Smuzhiyun ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ 92*4882a593Smuzhiyun - 8) - 1) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* 95*4882a593Smuzhiyun * Create a new kernel thread 96*4882a593Smuzhiyun */ 97*4882a593Smuzhiyun extern int kernel_thread(int (*fn) (void *), void *arg, unsigned long flags); 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define KSTK_EIP(tsk) instruction_pointer(task_pt_regs(tsk)) 100*4882a593Smuzhiyun #define KSTK_ESP(tsk) user_stack_pointer(task_pt_regs(tsk)) 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #endif 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #endif /* __ASM_NDS32_PROCESSOR_H */ 105