1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2013 Altera Corporation 3*4882a593Smuzhiyun * Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch> 4*4882a593Smuzhiyun * Copyright (C) 2004 Microtronix Datacom Ltd 5*4882a593Smuzhiyun * Copyright (C) 2001 Ken Hill (khill@microtronix.com) 6*4882a593Smuzhiyun * Vic Phillips (vic@microtronix.com) 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * based on SPARC asm/processor_32.h which is: 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Copyright (C) 1994 David S. Miller 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * This file is subject to the terms and conditions of the GNU General Public 13*4882a593Smuzhiyun * License. See the file "COPYING" in the main directory of this archive 14*4882a593Smuzhiyun * for more details. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef _ASM_NIOS2_PROCESSOR_H 18*4882a593Smuzhiyun #define _ASM_NIOS2_PROCESSOR_H 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include <asm/ptrace.h> 21*4882a593Smuzhiyun #include <asm/registers.h> 22*4882a593Smuzhiyun #include <asm/page.h> 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define NIOS2_FLAG_KTHREAD 0x00000001 /* task is a kernel thread */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define NIOS2_OP_NOP 0x1883a 27*4882a593Smuzhiyun #define NIOS2_OP_BREAK 0x3da03a 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #ifdef __KERNEL__ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define STACK_TOP TASK_SIZE 32*4882a593Smuzhiyun #define STACK_TOP_MAX STACK_TOP 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #endif /* __KERNEL__ */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* Kuser helpers is mapped to this user space address */ 37*4882a593Smuzhiyun #define KUSER_BASE 0x1000 38*4882a593Smuzhiyun #define KUSER_SIZE (PAGE_SIZE) 39*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun # define TASK_SIZE 0x7FFF0000UL 42*4882a593Smuzhiyun # define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* The Nios processor specific thread struct. */ 45*4882a593Smuzhiyun struct thread_struct { 46*4882a593Smuzhiyun struct pt_regs *kregs; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* Context switch saved kernel state. */ 49*4882a593Smuzhiyun unsigned long ksp; 50*4882a593Smuzhiyun unsigned long kpsr; 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define INIT_MMAP \ 54*4882a593Smuzhiyun { &init_mm, (0), (0), __pgprot(0x0), VM_READ | VM_WRITE | VM_EXEC } 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun # define INIT_THREAD { \ 57*4882a593Smuzhiyun .kregs = NULL, \ 58*4882a593Smuzhiyun .ksp = 0, \ 59*4882a593Smuzhiyun .kpsr = 0, \ 60*4882a593Smuzhiyun } 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun extern void start_thread(struct pt_regs *regs, unsigned long pc, 63*4882a593Smuzhiyun unsigned long sp); 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun struct task_struct; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* Free all resources held by a thread. */ release_thread(struct task_struct * dead_task)68*4882a593Smuzhiyunstatic inline void release_thread(struct task_struct *dead_task) 69*4882a593Smuzhiyun { 70*4882a593Smuzhiyun } 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun extern unsigned long get_wchan(struct task_struct *p); 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define task_pt_regs(p) \ 75*4882a593Smuzhiyun ((struct pt_regs *)(THREAD_SIZE + task_stack_page(p)) - 1) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun /* Used by procfs */ 78*4882a593Smuzhiyun #define KSTK_EIP(tsk) ((tsk)->thread.kregs->ea) 79*4882a593Smuzhiyun #define KSTK_ESP(tsk) ((tsk)->thread.kregs->sp) 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define cpu_relax() barrier() 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */ 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #endif /* _ASM_NIOS2_PROCESSOR_H */ 86