home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / sh / include / asm / system_32.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.8 KB  |  145 lines

  1. #ifndef __ASM_SH_SYSTEM_32_H
  2. #define __ASM_SH_SYSTEM_32_H
  3.  
  4. #include <linux/types.h>
  5.  
  6. struct task_struct *__switch_to(struct task_struct *prev,
  7.                 struct task_struct *next);
  8.  
  9. /*
  10.  *    switch_to() should switch tasks to task nr n, first
  11.  */
  12. #define switch_to(prev, next, last)                    \
  13. do {                                    \
  14.     register u32 *__ts1 __asm__ ("r1") = (u32 *)&prev->thread.sp;    \
  15.     register u32 *__ts2 __asm__ ("r2") = (u32 *)&prev->thread.pc;    \
  16.     register u32 *__ts4 __asm__ ("r4") = (u32 *)prev;        \
  17.     register u32 *__ts5 __asm__ ("r5") = (u32 *)next;        \
  18.     register u32 *__ts6 __asm__ ("r6") = (u32 *)&next->thread.sp;    \
  19.     register u32 __ts7 __asm__ ("r7") = next->thread.pc;        \
  20.     struct task_struct *__last;                    \
  21.                                     \
  22.     __asm__ __volatile__ (                        \
  23.         ".balign 4\n\t"                        \
  24.         "stc.l    gbr, @-r15\n\t"                    \
  25.         "sts.l    pr, @-r15\n\t"                    \
  26.         "mov.l    r8, @-r15\n\t"                    \
  27.         "mov.l    r9, @-r15\n\t"                    \
  28.         "mov.l    r10, @-r15\n\t"                    \
  29.         "mov.l    r11, @-r15\n\t"                    \
  30.         "mov.l    r12, @-r15\n\t"                    \
  31.         "mov.l    r13, @-r15\n\t"                    \
  32.         "mov.l    r14, @-r15\n\t"                    \
  33.         "mov.l    r15, @r1\t! save SP\n\t"            \
  34.         "mov.l    @r6, r15\t! change to new stack\n\t"        \
  35.         "mova    1f, %0\n\t"                    \
  36.         "mov.l    %0, @r2\t! save PC\n\t"                \
  37.         "mov.l    2f, %0\n\t"                    \
  38.         "jmp    @%0\t! call __switch_to\n\t"            \
  39.         " lds    r7, pr\t!  with return to new PC\n\t"        \
  40.         ".balign    4\n"                    \
  41.         "2:\n\t"                        \
  42.         ".long    __switch_to\n"                    \
  43.         "1:\n\t"                        \
  44.         "mov.l    @r15+, r14\n\t"                    \
  45.         "mov.l    @r15+, r13\n\t"                    \
  46.         "mov.l    @r15+, r12\n\t"                    \
  47.         "mov.l    @r15+, r11\n\t"                    \
  48.         "mov.l    @r15+, r10\n\t"                    \
  49.         "mov.l    @r15+, r9\n\t"                    \
  50.         "mov.l    @r15+, r8\n\t"                    \
  51.         "lds.l    @r15+, pr\n\t"                    \
  52.         "ldc.l    @r15+, gbr\n\t"                    \
  53.         : "=z" (__last)                        \
  54.         : "r" (__ts1), "r" (__ts2), "r" (__ts4),        \
  55.           "r" (__ts5), "r" (__ts6), "r" (__ts7)            \
  56.         : "r3", "t");                        \
  57.                                     \
  58.     last = __last;                            \
  59. } while (0)
  60.  
  61. #define __uses_jump_to_uncached \
  62.     noinline __attribute__ ((__section__ (".uncached.text")))
  63.  
  64. /*
  65.  * Jump to uncached area.
  66.  * When handling TLB or caches, we need to do it from an uncached area.
  67.  */
  68. #define jump_to_uncached()            \
  69. do {                        \
  70.     unsigned long __dummy;            \
  71.                         \
  72.     __asm__ __volatile__(            \
  73.         "mova    1f, %0\n\t"        \
  74.         "add    %1, %0\n\t"        \
  75.         "jmp    @%0\n\t"        \
  76.         " nop\n\t"            \
  77.         ".balign 4\n"            \
  78.         "1:"                \
  79.         : "=&z" (__dummy)        \
  80.         : "r" (cached_to_uncached));    \
  81. } while (0)
  82.  
  83. /*
  84.  * Back to cached area.
  85.  */
  86. #define back_to_cached()                \
  87. do {                            \
  88.     unsigned long __dummy;                \
  89.     ctrl_barrier();                    \
  90.     __asm__ __volatile__(                \
  91.         "mov.l    1f, %0\n\t"            \
  92.         "jmp    @%0\n\t"            \
  93.         " nop\n\t"                \
  94.         ".balign 4\n"                \
  95.         "1:    .long 2f\n"            \
  96.         "2:"                    \
  97.         : "=&r" (__dummy));            \
  98. } while (0)
  99.  
  100. #ifdef CONFIG_CPU_HAS_SR_RB
  101. #define lookup_exception_vector()    \
  102. ({                    \
  103.     unsigned long _vec;        \
  104.                     \
  105.     __asm__ __volatile__ (        \
  106.         "stc r2_bank, %0\n\t"    \
  107.         : "=r" (_vec)        \
  108.     );                \
  109.                     \
  110.     _vec;                \
  111. })
  112. #else
  113. #define lookup_exception_vector()    \
  114. ({                    \
  115.     unsigned long _vec;        \
  116.     __asm__ __volatile__ (        \
  117.         "mov r4, %0\n\t"    \
  118.         : "=r" (_vec)        \
  119.     );                \
  120.                     \
  121.     _vec;                \
  122. })
  123. #endif
  124.  
  125. int handle_unaligned_access(opcode_t instruction, struct pt_regs *regs,
  126.                 struct mem_access *ma);
  127.  
  128. asmlinkage void do_address_error(struct pt_regs *regs,
  129.                  unsigned long writeaccess,
  130.                  unsigned long address);
  131. asmlinkage void do_divide_error(unsigned long r4, unsigned long r5,
  132.                 unsigned long r6, unsigned long r7,
  133.                 struct pt_regs __regs);
  134. asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
  135.                 unsigned long r6, unsigned long r7,
  136.                 struct pt_regs __regs);
  137. asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
  138.                 unsigned long r6, unsigned long r7,
  139.                 struct pt_regs __regs);
  140. asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
  141.                    unsigned long r6, unsigned long r7,
  142.                    struct pt_regs __regs);
  143.  
  144. #endif /* __ASM_SH_SYSTEM_32_H */
  145.