101 lines
		
	
	
	
		
			2.4 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			101 lines
		
	
	
	
		
			2.4 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (C) 2013 Altera Corporation
							 | 
						||
| 
								 | 
							
								 * Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch>
							 | 
						||
| 
								 | 
							
								 * Copyright (C) 2004 Microtronix Datacom Ltd
							 | 
						||
| 
								 | 
							
								 * Copyright (C) 2001 Ken Hill (khill@microtronix.com)
							 | 
						||
| 
								 | 
							
								 *                    Vic Phillips (vic@microtronix.com)
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * based on SPARC asm/processor_32.h which is:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Copyright (C) 1994 David S. Miller
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This file is subject to the terms and conditions of the GNU General Public
							 | 
						||
| 
								 | 
							
								 * License.  See the file "COPYING" in the main directory of this archive
							 | 
						||
| 
								 | 
							
								 * for more details.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef _ASM_NIOS2_PROCESSOR_H
							 | 
						||
| 
								 | 
							
								#define _ASM_NIOS2_PROCESSOR_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <asm/ptrace.h>
							 | 
						||
| 
								 | 
							
								#include <asm/registers.h>
							 | 
						||
| 
								 | 
							
								#include <asm/page.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define NIOS2_FLAG_KTHREAD	0x00000001	/* task is a kernel thread */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define NIOS2_OP_NOP		0x1883a
							 | 
						||
| 
								 | 
							
								#define NIOS2_OP_BREAK		0x3da03a
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __KERNEL__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define STACK_TOP	TASK_SIZE
							 | 
						||
| 
								 | 
							
								#define STACK_TOP_MAX	STACK_TOP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* __KERNEL__ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Kuser helpers is mapped to this user space address */
							 | 
						||
| 
								 | 
							
								#define KUSER_BASE		0x1000
							 | 
						||
| 
								 | 
							
								#define KUSER_SIZE		(PAGE_SIZE)
							 | 
						||
| 
								 | 
							
								#ifndef __ASSEMBLY__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Default implementation of macro that returns current
							 | 
						||
| 
								 | 
							
								 * instruction pointer ("program counter").
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define current_text_addr() ({ __label__ _l; _l: &&_l; })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# define TASK_SIZE		0x7FFF0000UL
							 | 
						||
| 
								 | 
							
								# define TASK_UNMAPPED_BASE	(PAGE_ALIGN(TASK_SIZE / 3))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* The Nios processor specific thread struct. */
							 | 
						||
| 
								 | 
							
								struct thread_struct {
							 | 
						||
| 
								 | 
							
									struct pt_regs *kregs;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* Context switch saved kernel state. */
							 | 
						||
| 
								 | 
							
									unsigned long ksp;
							 | 
						||
| 
								 | 
							
									unsigned long kpsr;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define INIT_MMAP \
							 | 
						||
| 
								 | 
							
									{ &init_mm, (0), (0), __pgprot(0x0), VM_READ | VM_WRITE | VM_EXEC }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# define INIT_THREAD {			\
							 | 
						||
| 
								 | 
							
									.kregs	= NULL,			\
							 | 
						||
| 
								 | 
							
									.ksp	= 0,			\
							 | 
						||
| 
								 | 
							
									.kpsr	= 0,			\
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern void start_thread(struct pt_regs *regs, unsigned long pc,
							 | 
						||
| 
								 | 
							
											unsigned long sp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct task_struct;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Free all resources held by a thread. */
							 | 
						||
| 
								 | 
							
								static inline void release_thread(struct task_struct *dead_task)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Free current thread data structures etc.. */
							 | 
						||
| 
								 | 
							
								static inline void exit_thread(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Return saved PC of a blocked thread. */
							 | 
						||
| 
								 | 
							
								#define thread_saved_pc(tsk)	((tsk)->thread.kregs->ea)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern unsigned long get_wchan(struct task_struct *p);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define task_pt_regs(p) \
							 | 
						||
| 
								 | 
							
									((struct pt_regs *)(THREAD_SIZE + task_stack_page(p)) - 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Used by procfs */
							 | 
						||
| 
								 | 
							
								#define KSTK_EIP(tsk)	((tsk)->thread.kregs->ea)
							 | 
						||
| 
								 | 
							
								#define KSTK_ESP(tsk)	((tsk)->thread.kregs->sp)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define cpu_relax()	barrier()
							 | 
						||
| 
								 | 
							
								#define cpu_relax_lowlatency()  cpu_relax()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* __ASSEMBLY__ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* _ASM_NIOS2_PROCESSOR_H */
							 |