Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
mn10300
include
asm
processor.h
Go to the documentation of this file.
1
/* MN10300 Processor specifics
2
*
3
* Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd.
4
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
5
* Written by David Howells (
[email protected]
)
6
*
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public Licence
9
* as published by the Free Software Foundation; either version
10
* 2 of the Licence, or (at your option) any later version.
11
*/
12
13
#ifndef _ASM_PROCESSOR_H
14
#define _ASM_PROCESSOR_H
15
16
#include <
linux/threads.h
>
17
#include <
linux/thread_info.h
>
18
#include <asm/page.h>
19
#include <asm/ptrace.h>
20
#include <
asm/cpu-regs.h
>
21
#include <asm/uaccess.h>
22
#include <asm/current.h>
23
24
/* Forward declaration, a strange C thing */
25
struct
task_struct
;
26
struct
mm_struct
;
27
28
/*
29
* Default implementation of macro that returns current
30
* instruction pointer ("program counter").
31
*/
32
#define current_text_addr() \
33
({ \
34
void *__pc; \
35
asm("mov pc,%0" : "=a"(__pc)); \
36
__pc; \
37
})
38
39
extern
void
get_mem_info
(
unsigned
long
*
mem_base
,
unsigned
long
*
mem_size
);
40
41
extern
void
show_registers
(
struct
pt_regs
*
regs
);
42
43
/*
44
* CPU type and hardware bug flags. Kept separately for each CPU.
45
* Members of this structure are referenced in head.S, so think twice
46
* before touching them. [mj]
47
*/
48
49
struct
mn10300_cpuinfo
{
50
int
type
;
51
unsigned
long
loops_per_jiffy
;
52
char
hard_math
;
53
};
54
55
extern
struct
mn10300_cpuinfo
boot_cpu_data
;
56
57
#ifdef CONFIG_SMP
58
#if CONFIG_NR_CPUS < 2 || CONFIG_NR_CPUS > 8
59
# error Sorry, NR_CPUS should be 2 to 8
60
#endif
61
extern
struct
mn10300_cpuinfo
cpu_data
[];
62
#define current_cpu_data cpu_data[smp_processor_id()]
63
#else
/* CONFIG_SMP */
64
#define cpu_data &boot_cpu_data
65
#define current_cpu_data boot_cpu_data
66
#endif
/* CONFIG_SMP */
67
68
extern
void
identify_cpu
(
struct
mn10300_cpuinfo
*);
69
extern
void
print_cpu_info
(
struct
mn10300_cpuinfo
*);
70
extern
void
dodgy_tsc
(
void
);
71
#define cpu_relax() barrier()
72
73
/*
74
* User space process size: 1.75GB (default).
75
*/
76
#define TASK_SIZE 0x70000000
77
78
/*
79
* Where to put the userspace stack by default
80
*/
81
#define STACK_TOP 0x70000000
82
#define STACK_TOP_MAX STACK_TOP
83
84
/* This decides where the kernel will search for a free chunk of vm
85
* space during mmap's.
86
*/
87
#define TASK_UNMAPPED_BASE 0x30000000
88
89
struct
fpu_state_struct
{
90
unsigned
long
fs
[32];
/* fpu registers */
91
unsigned
long
fpcr
;
/* fpu control register */
92
};
93
94
struct
thread_struct
{
95
struct
pt_regs
*
uregs
;
/* userspace register frame */
96
unsigned
long
pc
;
/* kernel PC */
97
unsigned
long
sp
;
/* kernel SP */
98
unsigned
long
a3
;
/* kernel FP */
99
unsigned
long
wchan
;
100
unsigned
long
usp
;
101
unsigned
long
fpu_flags
;
102
#define THREAD_USING_FPU 0x00000001
/* T if this task is using the FPU */
103
#define THREAD_HAS_FPU 0x00000002
/* T if this task owns the FPU right now */
104
struct
fpu_state_struct
fpu_state
;
105
};
106
107
#define INIT_THREAD \
108
{ \
109
.uregs = init_uregs, \
110
.pc = 0, \
111
.sp = 0, \
112
.a3 = 0, \
113
.wchan = 0, \
114
}
115
116
#define INIT_MMAP \
117
{ &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, \
118
NULL, NULL }
119
120
/*
121
* do necessary setup to start up a newly executed thread
122
*/
123
static
inline
void
start_thread
(
struct
pt_regs
*
regs
,
124
unsigned
long
new_pc,
unsigned
long
new_sp)
125
{
126
regs->
epsw
= EPSW_nSL | EPSW_IE | EPSW_IM;
127
regs->
pc
= new_pc;
128
regs->
sp
= new_sp;
129
}
130
131
132
/* Free all resources held by a thread. */
133
extern
void
release_thread
(
struct
task_struct
*);
134
135
/*
136
* Return saved PC of a blocked thread.
137
*/
138
extern
unsigned
long
thread_saved_pc
(
struct
task_struct
*tsk);
139
140
unsigned
long
get_wchan
(
struct
task_struct
*
p
);
141
142
#define task_pt_regs(task) ((task)->thread.uregs)
143
#define KSTK_EIP(task) (task_pt_regs(task)->pc)
144
#define KSTK_ESP(task) (task_pt_regs(task)->sp)
145
146
#define KSTK_TOP(info) \
147
({ \
148
(unsigned long)(info) + THREAD_SIZE; \
149
})
150
151
#define ARCH_HAS_PREFETCH
152
#define ARCH_HAS_PREFETCHW
153
154
static
inline
void
prefetch
(
const
void
*
x
)
155
{
156
#ifdef CONFIG_MN10300_CACHE_ENABLED
157
#ifdef CONFIG_MN10300_PROC_MN103E010
158
asm
volatile
(
"nop; nop; dcpf (%0)"
: :
"r"
(
x
));
159
#else
160
asm
volatile
(
"dcpf (%0)"
: :
"r"
(
x
));
161
#endif
162
#endif
163
}
164
165
static
inline
void
prefetchw
(
const
void
*
x
)
166
{
167
#ifdef CONFIG_MN10300_CACHE_ENABLED
168
#ifdef CONFIG_MN10300_PROC_MN103E010
169
asm
volatile
(
"nop; nop; dcpf (%0)"
: :
"r"
(
x
));
170
#else
171
asm
volatile
(
"dcpf (%0)"
: :
"r"
(
x
));
172
#endif
173
#endif
174
}
175
176
#endif
/* _ASM_PROCESSOR_H */
Generated on Thu Jan 10 2013 12:50:18 for Linux Kernel by
1.8.2