xref: /openbmc/linux/arch/openrisc/include/asm/processor.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
258e0166aSJonas Bonn /*
358e0166aSJonas Bonn  * OpenRISC Linux
458e0166aSJonas Bonn  *
558e0166aSJonas Bonn  * Linux architectural port borrowing liberally from similar works of
658e0166aSJonas Bonn  * others.  All original copyrights apply as per the original source
758e0166aSJonas Bonn  * declaration.
858e0166aSJonas Bonn  *
958e0166aSJonas Bonn  * OpenRISC implementation:
1058e0166aSJonas Bonn  * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
1158e0166aSJonas Bonn  * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
1258e0166aSJonas Bonn  * et al.
1358e0166aSJonas Bonn  */
1458e0166aSJonas Bonn 
1558e0166aSJonas Bonn #ifndef __ASM_OPENRISC_PROCESSOR_H
1658e0166aSJonas Bonn #define __ASM_OPENRISC_PROCESSOR_H
1758e0166aSJonas Bonn 
1858e0166aSJonas Bonn #include <asm/spr_defs.h>
1958e0166aSJonas Bonn #include <asm/page.h>
2058e0166aSJonas Bonn #include <asm/ptrace.h>
2158e0166aSJonas Bonn 
2258e0166aSJonas Bonn #define STACK_TOP       TASK_SIZE
2358e0166aSJonas Bonn #define STACK_TOP_MAX	STACK_TOP
2458e0166aSJonas Bonn /* Kernel and user SR register setting */
2558e0166aSJonas Bonn #define KERNEL_SR (SPR_SR_DME | SPR_SR_IME | SPR_SR_ICE \
2658e0166aSJonas Bonn 		   | SPR_SR_DCE | SPR_SR_SM)
2758e0166aSJonas Bonn #define USER_SR   (SPR_SR_DME | SPR_SR_IME | SPR_SR_ICE \
2858e0166aSJonas Bonn 		   | SPR_SR_DCE | SPR_SR_IEE | SPR_SR_TEE)
2958e0166aSJonas Bonn 
3058e0166aSJonas Bonn /*
3158e0166aSJonas Bonn  * User space process size. This is hardcoded into a few places,
3258e0166aSJonas Bonn  * so don't change it unless you know what you are doing.
3358e0166aSJonas Bonn  */
3458e0166aSJonas Bonn 
3558e0166aSJonas Bonn #define TASK_SIZE       (0x80000000UL)
3658e0166aSJonas Bonn 
3758e0166aSJonas Bonn /* This decides where the kernel will search for a free chunk of vm
3858e0166aSJonas Bonn  * space during mmap's.
3958e0166aSJonas Bonn  */
4058e0166aSJonas Bonn #define TASK_UNMAPPED_BASE      (TASK_SIZE / 8 * 3)
4158e0166aSJonas Bonn 
4258e0166aSJonas Bonn #ifndef __ASSEMBLY__
4358e0166aSJonas Bonn 
4458e0166aSJonas Bonn struct task_struct;
4558e0166aSJonas Bonn 
4658e0166aSJonas Bonn struct thread_struct {
4758e0166aSJonas Bonn };
4858e0166aSJonas Bonn 
4958e0166aSJonas Bonn /*
5058e0166aSJonas Bonn  * At user->kernel entry, the pt_regs struct is stacked on the top of the
5158e0166aSJonas Bonn  * kernel-stack.  This macro allows us to find those regs for a task.
5258e0166aSJonas Bonn  * Notice that subsequent pt_regs stackings, like recursive interrupts
5358e0166aSJonas Bonn  * occurring while we're in the kernel, won't affect this - only the first
5458e0166aSJonas Bonn  * user->kernel transition registers are reached by this (i.e. not regs
5558e0166aSJonas Bonn  * for running signal handler)
5658e0166aSJonas Bonn  */
5758e0166aSJonas Bonn #define user_regs(thread_info)  (((struct pt_regs *)((unsigned long)(thread_info) + THREAD_SIZE - STACK_FRAME_OVERHEAD)) - 1)
5858e0166aSJonas Bonn 
5958e0166aSJonas Bonn /*
6058e0166aSJonas Bonn  * Dito but for the currently running task
6158e0166aSJonas Bonn  */
6258e0166aSJonas Bonn 
6358e0166aSJonas Bonn #define task_pt_regs(task) user_regs(task_thread_info(task))
6458e0166aSJonas Bonn 
6558e0166aSJonas Bonn #define INIT_SP         (sizeof(init_stack) + (unsigned long) &init_stack)
6658e0166aSJonas Bonn 
6758e0166aSJonas Bonn #define INIT_THREAD  { }
6858e0166aSJonas Bonn 
6958e0166aSJonas Bonn 
701bc0b9fdSJonas Bonn #define KSTK_EIP(tsk)   (task_pt_regs(tsk)->pc)
711bc0b9fdSJonas Bonn #define KSTK_ESP(tsk)   (task_pt_regs(tsk)->sp)
7258e0166aSJonas Bonn 
7358e0166aSJonas Bonn 
7458e0166aSJonas Bonn void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp);
7542a20f86SKees Cook unsigned long __get_wchan(struct task_struct *p);
76*8d4a1429SStafford Horne void show_registers(struct pt_regs *regs);
7758e0166aSJonas Bonn 
789b76beb0SVladimir Murzin #define cpu_relax()     barrier()
7958e0166aSJonas Bonn 
8058e0166aSJonas Bonn #endif /* __ASSEMBLY__ */
8158e0166aSJonas Bonn #endif /* __ASM_OPENRISC_PROCESSOR_H */
82