162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright (C) 2013 Altera Corporation
362306a36Sopenharmony_ci * Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch>
462306a36Sopenharmony_ci * Copyright (C) 2004 Microtronix Datacom Ltd
562306a36Sopenharmony_ci * Copyright (C) 2001 Ken Hill (khill@microtronix.com)
662306a36Sopenharmony_ci *                    Vic Phillips (vic@microtronix.com)
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * based on SPARC asm/processor_32.h which is:
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * Copyright (C) 1994 David S. Miller
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
1362306a36Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
1462306a36Sopenharmony_ci * for more details.
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#ifndef _ASM_NIOS2_PROCESSOR_H
1862306a36Sopenharmony_ci#define _ASM_NIOS2_PROCESSOR_H
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <asm/ptrace.h>
2162306a36Sopenharmony_ci#include <asm/registers.h>
2262306a36Sopenharmony_ci#include <asm/page.h>
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define NIOS2_FLAG_KTHREAD	0x00000001	/* task is a kernel thread */
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define NIOS2_OP_NOP		0x1883a
2762306a36Sopenharmony_ci#define NIOS2_OP_BREAK		0x3da03a
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#ifdef __KERNEL__
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define STACK_TOP	TASK_SIZE
3262306a36Sopenharmony_ci#define STACK_TOP_MAX	STACK_TOP
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#endif /* __KERNEL__ */
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/* Kuser helpers is mapped to this user space address */
3762306a36Sopenharmony_ci#define KUSER_BASE		0x1000
3862306a36Sopenharmony_ci#define KUSER_SIZE		(PAGE_SIZE)
3962306a36Sopenharmony_ci#ifndef __ASSEMBLY__
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci# define TASK_SIZE		0x7FFF0000UL
4262306a36Sopenharmony_ci# define TASK_UNMAPPED_BASE	(PAGE_ALIGN(TASK_SIZE / 3))
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* The Nios processor specific thread struct. */
4562306a36Sopenharmony_cistruct thread_struct {
4662306a36Sopenharmony_ci	struct pt_regs *kregs;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	/* Context switch saved kernel state. */
4962306a36Sopenharmony_ci	unsigned long ksp;
5062306a36Sopenharmony_ci	unsigned long kpsr;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci# define INIT_THREAD {			\
5462306a36Sopenharmony_ci	.kregs	= NULL,			\
5562306a36Sopenharmony_ci	.ksp	= 0,			\
5662306a36Sopenharmony_ci	.kpsr	= 0,			\
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ciextern void start_thread(struct pt_regs *regs, unsigned long pc,
6062306a36Sopenharmony_ci			unsigned long sp);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistruct task_struct;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciextern unsigned long __get_wchan(struct task_struct *p);
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci#define task_pt_regs(p) \
6762306a36Sopenharmony_ci	((struct pt_regs *)(THREAD_SIZE + task_stack_page(p)) - 1)
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/* Used by procfs */
7062306a36Sopenharmony_ci#define KSTK_EIP(tsk)	((tsk)->thread.kregs->ea)
7162306a36Sopenharmony_ci#define KSTK_ESP(tsk)	((tsk)->thread.kregs->sp)
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci#define cpu_relax()	barrier()
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#endif /* _ASM_NIOS2_PROCESSOR_H */
78