]>
Commit | Line | Data |
---|---|---|
4511ec15 | 1 | /* |
5233806d MS |
2 | * Copyright (C) 2008-2009 Michal Simek <monstr@monstr.eu> |
3 | * Copyright (C) 2008-2009 PetaLogix | |
4511ec15 MS |
4 | * Copyright (C) 2006 Atmark Techno, Inc. |
5 | * | |
6 | * This file is subject to the terms and conditions of the GNU General Public | |
7 | * License. See the file "COPYING" in the main directory of this archive | |
8 | * for more details. | |
9 | */ | |
10 | ||
11 | #ifndef _ASM_MICROBLAZE_PROCESSOR_H | |
12 | #define _ASM_MICROBLAZE_PROCESSOR_H | |
13 | ||
14 | #include <asm/ptrace.h> | |
15 | #include <asm/setup.h> | |
16 | #include <asm/registers.h> | |
2921e2bd MS |
17 | #include <asm/entry.h> |
18 | #include <asm/current.h> | |
4511ec15 MS |
19 | |
20 | # ifndef __ASSEMBLY__ | |
21 | /* from kernel/cpu/mb.c */ | |
22 | extern const struct seq_operations cpuinfo_op; | |
23 | ||
24 | # define cpu_relax() barrier() | |
3a6bfbc9 | 25 | # define cpu_relax_lowlatency() cpu_relax() |
4511ec15 | 26 | |
2eba318e MS |
27 | #define task_pt_regs(tsk) \ |
28 | (((struct pt_regs *)(THREAD_SIZE + task_stack_page(tsk))) - 1) | |
29 | ||
e1c4bd08 MS |
30 | /* Do necessary setup to start up a newly executed thread. */ |
31 | void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long usp); | |
32 | ||
0dd90aa9 | 33 | extern void ret_from_fork(void); |
2319295d | 34 | extern void ret_from_kernel_thread(void); |
0dd90aa9 | 35 | |
5233806d MS |
36 | # endif /* __ASSEMBLY__ */ |
37 | ||
38 | # ifndef CONFIG_MMU | |
4511ec15 MS |
39 | /* |
40 | * User space process size: memory size | |
41 | * | |
42 | * TASK_SIZE on MMU cpu is usually 1GB. However, on no-MMU arch, both | |
43 | * user processes and the kernel is on the same memory region. They | |
44 | * both share the memory space and that is limited by the amount of | |
45 | * physical memory. thus, we set TASK_SIZE == amount of total memory. | |
46 | */ | |
47 | # define TASK_SIZE (0x81000000 - 0x80000000) | |
48 | ||
49 | /* | |
50 | * Default implementation of macro that returns current | |
51 | * instruction pointer ("program counter"). | |
52 | */ | |
53 | # define current_text_addr() ({ __label__ _l; _l: &&_l; }) | |
54 | ||
55 | /* | |
56 | * This decides where the kernel will search for a free chunk of vm | |
57 | * space during mmap's. We won't be using it | |
58 | */ | |
59 | # define TASK_UNMAPPED_BASE 0 | |
60 | ||
61 | /* definition in include/linux/sched.h */ | |
62 | struct task_struct; | |
63 | ||
64 | /* thread_struct is gone. use thread_info instead. */ | |
65 | struct thread_struct { }; | |
66 | # define INIT_THREAD { } | |
67 | ||
4511ec15 MS |
68 | /* Free all resources held by a thread. */ |
69 | static inline void release_thread(struct task_struct *dead_task) | |
70 | { | |
71 | } | |
72 | ||
4511ec15 MS |
73 | extern unsigned long thread_saved_pc(struct task_struct *t); |
74 | ||
75 | extern unsigned long get_wchan(struct task_struct *p); | |
76 | ||
4511ec15 MS |
77 | # define KSTK_EIP(tsk) (0) |
78 | # define KSTK_ESP(tsk) (0) | |
79 | ||
5233806d MS |
80 | # else /* CONFIG_MMU */ |
81 | ||
82 | /* | |
83 | * This is used to define STACK_TOP, and with MMU it must be below | |
84 | * kernel base to select the correct PGD when handling MMU exceptions. | |
85 | */ | |
86 | # define TASK_SIZE (CONFIG_KERNEL_START) | |
87 | ||
88 | /* | |
89 | * This decides where the kernel will search for a free chunk of vm | |
90 | * space during mmap's. | |
91 | */ | |
92 | # define TASK_UNMAPPED_BASE (TASK_SIZE / 8 * 3) | |
93 | ||
94 | # define THREAD_KSP 0 | |
95 | ||
96 | # ifndef __ASSEMBLY__ | |
97 | ||
98 | /* | |
99 | * Default implementation of macro that returns current | |
100 | * instruction pointer ("program counter"). | |
101 | */ | |
102 | # define current_text_addr() ({ __label__ _l; _l: &&_l; }) | |
103 | ||
104 | /* If you change this, you must change the associated assembly-languages | |
105 | * constants defined below, THREAD_*. | |
106 | */ | |
107 | struct thread_struct { | |
108 | /* kernel stack pointer (must be first field in structure) */ | |
109 | unsigned long ksp; | |
110 | unsigned long ksp_limit; /* if ksp <= ksp_limit stack overflow */ | |
111 | void *pgdir; /* root of page-table tree */ | |
112 | struct pt_regs *regs; /* Pointer to saved register state */ | |
113 | }; | |
114 | ||
115 | # define INIT_THREAD { \ | |
116 | .ksp = sizeof init_stack + (unsigned long)init_stack, \ | |
117 | .pgdir = swapper_pg_dir, \ | |
118 | } | |
119 | ||
5233806d | 120 | /* Free all resources held by a thread. */ |
ace526eb | 121 | static inline void release_thread(struct task_struct *dead_task) |
5233806d MS |
122 | { |
123 | } | |
124 | ||
5233806d MS |
125 | /* Return saved (kernel) PC of a blocked thread. */ |
126 | # define thread_saved_pc(tsk) \ | |
127 | ((tsk)->thread.regs ? (tsk)->thread.regs->r15 : 0) | |
128 | ||
129 | unsigned long get_wchan(struct task_struct *p); | |
130 | ||
131 | /* The size allocated for kernel stacks. This _must_ be a power of two! */ | |
132 | # define KERNEL_STACK_SIZE 0x2000 | |
133 | ||
134 | /* Return some info about the user process TASK. */ | |
135 | # define task_tos(task) ((unsigned long)(task) + KERNEL_STACK_SIZE) | |
136 | # define task_regs(task) ((struct pt_regs *)task_tos(task) - 1) | |
137 | ||
138 | # define task_pt_regs_plus_args(tsk) \ | |
6e83557c | 139 | ((void *)task_pt_regs(tsk)) |
5233806d MS |
140 | |
141 | # define task_sp(task) (task_regs(task)->r1) | |
142 | # define task_pc(task) (task_regs(task)->pc) | |
143 | /* Grotty old names for some. */ | |
144 | # define KSTK_EIP(task) (task_pc(task)) | |
145 | # define KSTK_ESP(task) (task_sp(task)) | |
146 | ||
147 | /* FIXME */ | |
148 | # define deactivate_mm(tsk, mm) do { } while (0) | |
149 | ||
150 | # define STACK_TOP TASK_SIZE | |
151 | # define STACK_TOP_MAX STACK_TOP | |
152 | ||
c40d04df DH |
153 | #ifdef CONFIG_DEBUG_FS |
154 | extern struct dentry *of_debugfs_root; | |
155 | #endif | |
156 | ||
5233806d MS |
157 | # endif /* __ASSEMBLY__ */ |
158 | # endif /* CONFIG_MMU */ | |
4511ec15 | 159 | #endif /* _ASM_MICROBLAZE_PROCESSOR_H */ |