1 /* MN10300 Processor specifics
3 * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd.
4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
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.
13 #ifndef _ASM_PROCESSOR_H
14 #define _ASM_PROCESSOR_H
17 #include <asm/ptrace.h>
18 #include <asm/cpu-regs.h>
19 #include <linux/threads.h>
21 /* Forward declaration, a strange C thing */
26 * Default implementation of macro that returns current
27 * instruction pointer ("program counter").
29 #define current_text_addr() \
32 asm("mov pc,%0" : "=a"(__pc)); \
36 extern void get_mem_info(unsigned long *mem_base, unsigned long *mem_size);
38 extern void show_registers(struct pt_regs *regs);
41 * CPU type and hardware bug flags. Kept separately for each CPU.
42 * Members of this structure are referenced in head.S, so think twice
43 * before touching them. [mj]
46 struct mn10300_cpuinfo {
48 unsigned long loops_per_jiffy;
52 extern struct mn10300_cpuinfo boot_cpu_data;
55 #if CONFIG_NR_CPUS < 2 || CONFIG_NR_CPUS > 8
56 # error Sorry, NR_CPUS should be 2 to 8
58 extern struct mn10300_cpuinfo cpu_data[];
59 #define current_cpu_data cpu_data[smp_processor_id()]
60 #else /* CONFIG_SMP */
61 #define cpu_data &boot_cpu_data
62 #define current_cpu_data boot_cpu_data
63 #endif /* CONFIG_SMP */
65 extern void identify_cpu(struct mn10300_cpuinfo *);
66 extern void print_cpu_info(struct mn10300_cpuinfo *);
67 extern void dodgy_tsc(void);
68 #define cpu_relax() barrier()
71 * User space process size: 1.75GB (default).
73 #define TASK_SIZE 0x70000000
76 * Where to put the userspace stack by default
78 #define STACK_TOP 0x70000000
79 #define STACK_TOP_MAX STACK_TOP
81 /* This decides where the kernel will search for a free chunk of vm
82 * space during mmap's.
84 #define TASK_UNMAPPED_BASE 0x30000000
90 struct fpu_state_struct {
91 unsigned long fs[32]; /* fpu registers */
92 unsigned long fpcr; /* fpu control register */
95 struct thread_struct {
96 struct pt_regs *uregs; /* userspace register frame */
97 unsigned long pc; /* kernel PC */
98 unsigned long sp; /* kernel SP */
99 unsigned long a3; /* kernel FP */
102 struct pt_regs *frame;
103 unsigned long fpu_flags;
104 #define THREAD_USING_FPU 0x00000001 /* T if this task is using the FPU */
105 #define THREAD_HAS_FPU 0x00000002 /* T if this task owns the FPU right now */
106 struct fpu_state_struct fpu_state;
109 #define INIT_THREAD \
111 .uregs = init_uregs, \
120 { &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, \
124 * do necessary setup to start up a newly executed thread
125 * - need to discard the frame stacked by the kernel thread invoking the execve
126 * syscall (see RESTORE_ALL macro)
128 #if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT) /* FIXME */
129 #define start_thread(regs, new_pc, new_sp) do { \
134 ___frame[cpu] = current->thread.uregs; \
135 ___frame[cpu]->epsw = EPSW_nSL | EPSW_IE | EPSW_IM;\
136 ___frame[cpu]->pc = new_pc; \
137 ___frame[cpu]->sp = new_sp; \
140 #else /* CONFIG_SMP && CONFIG_PREEMPT */
141 #define start_thread(regs, new_pc, new_sp) do { \
143 __frame = current->thread.uregs; \
144 __frame->epsw = EPSW_nSL | EPSW_IE | EPSW_IM; \
145 __frame->pc = new_pc; \
146 __frame->sp = new_sp; \
148 #endif /* CONFIG_SMP && CONFIG_PREEMPT */
150 /* Free all resources held by a thread. */
151 extern void release_thread(struct task_struct *);
153 /* Prepare to copy thread state - unlazy all lazy status */
154 extern void prepare_to_copy(struct task_struct *tsk);
157 * create a kernel thread without removing it from tasklists
159 extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
162 * Return saved PC of a blocked thread.
164 extern unsigned long thread_saved_pc(struct task_struct *tsk);
166 unsigned long get_wchan(struct task_struct *p);
168 #define task_pt_regs(task) ((task)->thread.uregs)
169 #define KSTK_EIP(task) (task_pt_regs(task)->pc)
170 #define KSTK_ESP(task) (task_pt_regs(task)->sp)
172 #define KSTK_TOP(info) \
174 (unsigned long)(info) + THREAD_SIZE; \
177 #define ARCH_HAS_PREFETCH
178 #define ARCH_HAS_PREFETCHW
180 static inline void prefetch(const void *x)
182 #ifdef CONFIG_MN10300_CACHE_ENABLED
183 #ifdef CONFIG_MN10300_PROC_MN103E010
184 asm volatile ("nop; nop; dcpf (%0)" : : "r"(x));
186 asm volatile ("dcpf (%0)" : : "r"(x));
191 static inline void prefetchw(const void *x)
193 #ifdef CONFIG_MN10300_CACHE_ENABLED
194 #ifdef CONFIG_MN10300_PROC_MN103E010
195 asm volatile ("nop; nop; dcpf (%0)" : : "r"(x));
197 asm volatile ("dcpf (%0)" : : "r"(x));
202 #endif /* _ASM_PROCESSOR_H */