processor.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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 (dhowells@redhat.com)
  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. #ifndef _ASM_PROCESSOR_H
  13. #define _ASM_PROCESSOR_H
  14. #include <asm/page.h>
  15. #include <asm/ptrace.h>
  16. #include <asm/cpu-regs.h>
  17. #include <linux/threads.h>
  18. /* Forward declaration, a strange C thing */
  19. struct task_struct;
  20. struct mm_struct;
  21. /*
  22. * Default implementation of macro that returns current
  23. * instruction pointer ("program counter").
  24. */
  25. #define current_text_addr() \
  26. ({ \
  27. void *__pc; \
  28. asm("mov pc,%0" : "=a"(__pc)); \
  29. __pc; \
  30. })
  31. extern void get_mem_info(unsigned long *mem_base, unsigned long *mem_size);
  32. extern void show_registers(struct pt_regs *regs);
  33. /*
  34. * CPU type and hardware bug flags. Kept separately for each CPU.
  35. * Members of this structure are referenced in head.S, so think twice
  36. * before touching them. [mj]
  37. */
  38. struct mn10300_cpuinfo {
  39. int type;
  40. unsigned long loops_per_jiffy;
  41. char hard_math;
  42. };
  43. extern struct mn10300_cpuinfo boot_cpu_data;
  44. #ifdef CONFIG_SMP
  45. #if CONFIG_NR_CPUS < 2 || CONFIG_NR_CPUS > 8
  46. # error Sorry, NR_CPUS should be 2 to 8
  47. #endif
  48. extern struct mn10300_cpuinfo cpu_data[];
  49. #define current_cpu_data cpu_data[smp_processor_id()]
  50. #else /* CONFIG_SMP */
  51. #define cpu_data &boot_cpu_data
  52. #define current_cpu_data boot_cpu_data
  53. #endif /* CONFIG_SMP */
  54. extern void identify_cpu(struct mn10300_cpuinfo *);
  55. extern void print_cpu_info(struct mn10300_cpuinfo *);
  56. extern void dodgy_tsc(void);
  57. #define cpu_relax() barrier()
  58. /*
  59. * User space process size: 1.75GB (default).
  60. */
  61. #define TASK_SIZE 0x70000000
  62. /*
  63. * Where to put the userspace stack by default
  64. */
  65. #define STACK_TOP 0x70000000
  66. #define STACK_TOP_MAX STACK_TOP
  67. /* This decides where the kernel will search for a free chunk of vm
  68. * space during mmap's.
  69. */
  70. #define TASK_UNMAPPED_BASE 0x30000000
  71. typedef struct {
  72. unsigned long seg;
  73. } mm_segment_t;
  74. struct fpu_state_struct {
  75. unsigned long fs[32]; /* fpu registers */
  76. unsigned long fpcr; /* fpu control register */
  77. };
  78. struct thread_struct {
  79. struct pt_regs *uregs; /* userspace register frame */
  80. unsigned long pc; /* kernel PC */
  81. unsigned long sp; /* kernel SP */
  82. unsigned long a3; /* kernel FP */
  83. unsigned long wchan;
  84. unsigned long usp;
  85. struct pt_regs *frame;
  86. unsigned long fpu_flags;
  87. #define THREAD_USING_FPU 0x00000001 /* T if this task is using the FPU */
  88. #define THREAD_HAS_FPU 0x00000002 /* T if this task owns the FPU right now */
  89. struct fpu_state_struct fpu_state;
  90. };
  91. #define INIT_THREAD \
  92. { \
  93. .uregs = init_uregs, \
  94. .pc = 0, \
  95. .sp = 0, \
  96. .a3 = 0, \
  97. .wchan = 0, \
  98. .frame = NULL, \
  99. }
  100. #define INIT_MMAP \
  101. { &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, \
  102. NULL, NULL }
  103. /*
  104. * do necessary setup to start up a newly executed thread
  105. * - need to discard the frame stacked by the kernel thread invoking the execve
  106. * syscall (see RESTORE_ALL macro)
  107. */
  108. #if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT) /* FIXME */
  109. #define start_thread(regs, new_pc, new_sp) do { \
  110. int cpu; \
  111. preempt_disable(); \
  112. cpu = CPUID; \
  113. set_fs(USER_DS); \
  114. ___frame[cpu] = current->thread.uregs; \
  115. ___frame[cpu]->epsw = EPSW_nSL | EPSW_IE | EPSW_IM;\
  116. ___frame[cpu]->pc = new_pc; \
  117. ___frame[cpu]->sp = new_sp; \
  118. preempt_enable(); \
  119. } while (0)
  120. #else /* CONFIG_SMP && CONFIG_PREEMPT */
  121. #define start_thread(regs, new_pc, new_sp) do { \
  122. set_fs(USER_DS); \
  123. __frame = current->thread.uregs; \
  124. __frame->epsw = EPSW_nSL | EPSW_IE | EPSW_IM; \
  125. __frame->pc = new_pc; \
  126. __frame->sp = new_sp; \
  127. } while (0)
  128. #endif /* CONFIG_SMP && CONFIG_PREEMPT */
  129. /* Free all resources held by a thread. */
  130. extern void release_thread(struct task_struct *);
  131. /* Prepare to copy thread state - unlazy all lazy status */
  132. extern void prepare_to_copy(struct task_struct *tsk);
  133. /*
  134. * create a kernel thread without removing it from tasklists
  135. */
  136. extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
  137. /*
  138. * Return saved PC of a blocked thread.
  139. */
  140. extern unsigned long thread_saved_pc(struct task_struct *tsk);
  141. unsigned long get_wchan(struct task_struct *p);
  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. #define KSTK_TOP(info) \
  146. ({ \
  147. (unsigned long)(info) + THREAD_SIZE; \
  148. })
  149. #define ARCH_HAS_PREFETCH
  150. #define ARCH_HAS_PREFETCHW
  151. static inline void prefetch(const void *x)
  152. {
  153. #ifdef CONFIG_MN10300_CACHE_ENABLED
  154. #ifdef CONFIG_MN10300_PROC_MN103E010
  155. asm volatile ("nop; nop; dcpf (%0)" : : "r"(x));
  156. #else
  157. asm volatile ("dcpf (%0)" : : "r"(x));
  158. #endif
  159. #endif
  160. }
  161. static inline void prefetchw(const void *x)
  162. {
  163. #ifdef CONFIG_MN10300_CACHE_ENABLED
  164. #ifdef CONFIG_MN10300_PROC_MN103E010
  165. asm volatile ("nop; nop; dcpf (%0)" : : "r"(x));
  166. #else
  167. asm volatile ("dcpf (%0)" : : "r"(x));
  168. #endif
  169. #endif
  170. }
  171. #endif /* _ASM_PROCESSOR_H */