xref: /openbmc/linux/arch/openrisc/include/asm/processor.h (revision 58e0166a4772aaeb10c9b0f6d59f19099d2047df)
1*58e0166aSJonas Bonn /*
2*58e0166aSJonas Bonn  * OpenRISC Linux
3*58e0166aSJonas Bonn  *
4*58e0166aSJonas Bonn  * Linux architectural port borrowing liberally from similar works of
5*58e0166aSJonas Bonn  * others.  All original copyrights apply as per the original source
6*58e0166aSJonas Bonn  * declaration.
7*58e0166aSJonas Bonn  *
8*58e0166aSJonas Bonn  * OpenRISC implementation:
9*58e0166aSJonas Bonn  * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
10*58e0166aSJonas Bonn  * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
11*58e0166aSJonas Bonn  * et al.
12*58e0166aSJonas Bonn  *
13*58e0166aSJonas Bonn  * This program is free software; you can redistribute it and/or modify
14*58e0166aSJonas Bonn  * it under the terms of the GNU General Public License as published by
15*58e0166aSJonas Bonn  * the Free Software Foundation; either version 2 of the License, or
16*58e0166aSJonas Bonn  * (at your option) any later version.
17*58e0166aSJonas Bonn  */
18*58e0166aSJonas Bonn 
19*58e0166aSJonas Bonn #ifndef __ASM_OPENRISC_PROCESSOR_H
20*58e0166aSJonas Bonn #define __ASM_OPENRISC_PROCESSOR_H
21*58e0166aSJonas Bonn 
22*58e0166aSJonas Bonn #include <asm/spr_defs.h>
23*58e0166aSJonas Bonn #include <asm/page.h>
24*58e0166aSJonas Bonn #include <asm/ptrace.h>
25*58e0166aSJonas Bonn 
26*58e0166aSJonas Bonn #define STACK_TOP       TASK_SIZE
27*58e0166aSJonas Bonn #define STACK_TOP_MAX	STACK_TOP
28*58e0166aSJonas Bonn /* Kernel and user SR register setting */
29*58e0166aSJonas Bonn #define KERNEL_SR (SPR_SR_DME | SPR_SR_IME | SPR_SR_ICE \
30*58e0166aSJonas Bonn 		   | SPR_SR_DCE | SPR_SR_SM)
31*58e0166aSJonas Bonn #define USER_SR   (SPR_SR_DME | SPR_SR_IME | SPR_SR_ICE \
32*58e0166aSJonas Bonn 		   | SPR_SR_DCE | SPR_SR_IEE | SPR_SR_TEE)
33*58e0166aSJonas Bonn /*
34*58e0166aSJonas Bonn  * Default implementation of macro that returns current
35*58e0166aSJonas Bonn  * instruction pointer ("program counter").
36*58e0166aSJonas Bonn  */
37*58e0166aSJonas Bonn #define current_text_addr() ({ __label__ _l; _l: &&_l; })
38*58e0166aSJonas Bonn 
39*58e0166aSJonas Bonn /*
40*58e0166aSJonas Bonn  * User space process size. This is hardcoded into a few places,
41*58e0166aSJonas Bonn  * so don't change it unless you know what you are doing.
42*58e0166aSJonas Bonn  */
43*58e0166aSJonas Bonn 
44*58e0166aSJonas Bonn #define TASK_SIZE       (0x80000000UL)
45*58e0166aSJonas Bonn 
46*58e0166aSJonas Bonn /* This decides where the kernel will search for a free chunk of vm
47*58e0166aSJonas Bonn  * space during mmap's.
48*58e0166aSJonas Bonn  */
49*58e0166aSJonas Bonn #define TASK_UNMAPPED_BASE      (TASK_SIZE / 8 * 3)
50*58e0166aSJonas Bonn 
51*58e0166aSJonas Bonn #ifndef __ASSEMBLY__
52*58e0166aSJonas Bonn 
53*58e0166aSJonas Bonn struct task_struct;
54*58e0166aSJonas Bonn 
55*58e0166aSJonas Bonn struct thread_struct {
56*58e0166aSJonas Bonn };
57*58e0166aSJonas Bonn 
58*58e0166aSJonas Bonn /*
59*58e0166aSJonas Bonn  * At user->kernel entry, the pt_regs struct is stacked on the top of the
60*58e0166aSJonas Bonn  * kernel-stack.  This macro allows us to find those regs for a task.
61*58e0166aSJonas Bonn  * Notice that subsequent pt_regs stackings, like recursive interrupts
62*58e0166aSJonas Bonn  * occurring while we're in the kernel, won't affect this - only the first
63*58e0166aSJonas Bonn  * user->kernel transition registers are reached by this (i.e. not regs
64*58e0166aSJonas Bonn  * for running signal handler)
65*58e0166aSJonas Bonn  */
66*58e0166aSJonas Bonn #define user_regs(thread_info)  (((struct pt_regs *)((unsigned long)(thread_info) + THREAD_SIZE - STACK_FRAME_OVERHEAD)) - 1)
67*58e0166aSJonas Bonn 
68*58e0166aSJonas Bonn /*
69*58e0166aSJonas Bonn  * Dito but for the currently running task
70*58e0166aSJonas Bonn  */
71*58e0166aSJonas Bonn 
72*58e0166aSJonas Bonn #define task_pt_regs(task) user_regs(task_thread_info(task))
73*58e0166aSJonas Bonn #define current_regs() user_regs(current_thread_info())
74*58e0166aSJonas Bonn 
75*58e0166aSJonas Bonn extern inline void prepare_to_copy(struct task_struct *tsk)
76*58e0166aSJonas Bonn {
77*58e0166aSJonas Bonn }
78*58e0166aSJonas Bonn 
79*58e0166aSJonas Bonn #define INIT_SP         (sizeof(init_stack) + (unsigned long) &init_stack)
80*58e0166aSJonas Bonn 
81*58e0166aSJonas Bonn #define INIT_THREAD  { }
82*58e0166aSJonas Bonn 
83*58e0166aSJonas Bonn 
84*58e0166aSJonas Bonn #define KSTK_EIP(tsk)   (task_pt_regs(tsk)->pc);
85*58e0166aSJonas Bonn #define KSTK_ESP(tsk)   (task_pt_regs(tsk)->sp);
86*58e0166aSJonas Bonn 
87*58e0166aSJonas Bonn 
88*58e0166aSJonas Bonn extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
89*58e0166aSJonas Bonn 
90*58e0166aSJonas Bonn void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp);
91*58e0166aSJonas Bonn void release_thread(struct task_struct *);
92*58e0166aSJonas Bonn unsigned long get_wchan(struct task_struct *p);
93*58e0166aSJonas Bonn 
94*58e0166aSJonas Bonn /*
95*58e0166aSJonas Bonn  * Free current thread data structures etc..
96*58e0166aSJonas Bonn  */
97*58e0166aSJonas Bonn 
98*58e0166aSJonas Bonn extern inline void exit_thread(void)
99*58e0166aSJonas Bonn {
100*58e0166aSJonas Bonn 	/* Nothing needs to be done.  */
101*58e0166aSJonas Bonn }
102*58e0166aSJonas Bonn 
103*58e0166aSJonas Bonn /*
104*58e0166aSJonas Bonn  * Return saved PC of a blocked thread. For now, this is the "user" PC
105*58e0166aSJonas Bonn  */
106*58e0166aSJonas Bonn extern unsigned long thread_saved_pc(struct task_struct *t);
107*58e0166aSJonas Bonn 
108*58e0166aSJonas Bonn #define init_stack      (init_thread_union.stack)
109*58e0166aSJonas Bonn 
110*58e0166aSJonas Bonn #define cpu_relax()     do { } while (0)
111*58e0166aSJonas Bonn 
112*58e0166aSJonas Bonn #endif /* __ASSEMBLY__ */
113*58e0166aSJonas Bonn #endif /* __ASM_OPENRISC_PROCESSOR_H */
114