system.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:10k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  include/asm-s390/system.h
  3.  *
  4.  *  S390 version
  5.  *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6.  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
  7.  *
  8.  *  Derived from "include/asm-i386/system.h"
  9.  */
  10. #ifndef __ASM_SYSTEM_H
  11. #define __ASM_SYSTEM_H
  12. #include <linux/config.h>
  13. #ifdef __KERNEL__
  14. #include <asm/lowcore.h>
  15. #endif
  16. #include <linux/kernel.h>
  17. #define prepare_to_switch() do { } while(0)
  18. #define switch_to(prev,next,last) do {                                       
  19.         if (prev == next)                                                    
  20.                 break;                                                       
  21. save_fp_regs(&prev->thread.fp_regs);                                 
  22. restore_fp_regs(&next->thread.fp_regs);                    
  23. last = resume(&prev->thread,&next->thread);                          
  24. } while (0)
  25. struct task_struct;
  26. #define nop() __asm__ __volatile__ ("nop")
  27. #define xchg(ptr,x) 
  28.   ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(void *)(ptr),sizeof(*(ptr))))
  29. extern void __misaligned_u16(void);
  30. extern void __misaligned_u32(void);
  31. extern void __misaligned_u64(void);
  32. static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
  33. {
  34.         switch (size) {
  35.                 case 1:
  36.                         asm volatile (
  37.                                 "   lghi  1,3n"
  38.                                 "   nr    1,%0n"     /* isolate last 2 bits */
  39.                                 "   xr    %0,1n"     /* align ptr */
  40.                                 "   bras  2,0fn"
  41.                                 "   icm   1,8,7(%1)n"   /* for ptr&3 == 0 */
  42.                                 "   stcm  0,8,7(%1)n"
  43.                                 "   icm   1,4,7(%1)n"   /* for ptr&3 == 1 */
  44.                                 "   stcm  0,4,7(%1)n"
  45.                                 "   icm   1,2,7(%1)n"   /* for ptr&3 == 2 */
  46.                                 "   stcm  0,2,7(%1)n"
  47.                                 "   icm   1,1,7(%1)n"   /* for ptr&3 == 3 */
  48.                                 "   stcm  0,1,7(%1)n"
  49.                                 "0: sll   1,3n"
  50.                                 "   la    2,0(1,2)n" /* r2 points to an icm */
  51.                                 "   l     0,0(%0)n"  /* get fullword */
  52.                                 "1: lr    1,0n"      /* cs loop */
  53.                                 "   ex    0,0(2)n"   /* insert x */
  54.                                 "   cs    0,1,0(%0)n"
  55.                                 "   jl    1bn"
  56.                                 "   ex    0,4(2)"     /* store *ptr to x */
  57.                                 : "+&a" (ptr) : "a" (&x)
  58.                                 : "memory", "cc", "0", "1", "2");
  59. break;
  60.                 case 2:
  61.                         if(((addr_t)ptr)&1)
  62. __misaligned_u16();
  63.                         asm volatile (
  64.                                 "   lghi  1,2n"
  65.                                 "   nr    1,%0n"     /* isolate bit 2^1 */
  66.                                 "   xr    %0,1n"     /* align ptr */
  67.                                 "   bras  2,0fn"
  68.                                 "   icm   1,12,6(%1)n"   /* for ptr&2 == 0 */
  69.                                 "   stcm  0,12,6(%1)n"
  70.                                 "   icm   1,3,2(%1)n"    /* for ptr&2 == 1 */
  71.                                 "   stcm  0,3,2(%1)n"
  72.                                 "0: sll   1,2n"
  73.                                 "   la    2,0(1,2)n" /* r2 points to an icm */
  74.                                 "   l     0,0(%0)n"  /* get fullword */
  75.                                 "1: lr    1,0n"      /* cs loop */
  76.                                 "   ex    0,0(2)n"   /* insert x */
  77.                                 "   cs    0,1,0(%0)n"
  78.                                 "   jl    1bn"
  79.                                 "   ex    0,4(2)"     /* store *ptr to x */
  80.                                 : "+&a" (ptr) : "a" (&x)
  81.                                 : "memory", "cc", "0", "1", "2");
  82.                         break;
  83.                 case 4:
  84.                         if(((addr_t)ptr)&3)
  85. __misaligned_u32();
  86.                         asm volatile (
  87.                                 "    l    0,0(%1)n"
  88.                                 "0:  cs   0,%0,0(%1)n"
  89.                                 "    jl   0bn"
  90.                                 "    lgfr %0,0n"
  91.                                 : "+d" (x) : "a" (ptr)
  92.                                 : "memory", "cc", "0" );
  93.                         break;
  94.                 case 8:
  95.                         if(((addr_t)ptr)&7)
  96. __misaligned_u64();
  97.                         asm volatile (
  98.                                 "    lg  0,0(%1)n"
  99.                                 "0:  csg 0,%0,0(%1)n"
  100.                                 "    jl  0bn"
  101.                                 "    lgr %0,0n"
  102.                                 : "+d" (x) : "a" (ptr)
  103.                                 : "memory", "cc", "0" );
  104.                         break;
  105.                default:
  106.                         abort();
  107.         }
  108.         return x;
  109. }
  110. /*
  111.  * Force strict CPU ordering.
  112.  * And yes, this is required on UP too when we're talking
  113.  * to devices.
  114.  *
  115.  * This is very similar to the ppc eieio/sync instruction in that is
  116.  * does a checkpoint syncronisation & makes sure that 
  117.  * all memory ops have completed wrt other CPU's ( see 7-15 POP  DJB ).
  118.  */
  119. #define eieio()  __asm__ __volatile__ ("BCR 15,0") 
  120. # define SYNC_OTHER_CORES(x)   eieio() 
  121. #define mb()    eieio()
  122. #define rmb()   eieio()
  123. #define wmb()   eieio()
  124. #define smp_mb()       mb()
  125. #define smp_rmb()      rmb()
  126. #define smp_wmb()      wmb()
  127. #define smp_mb__before_clear_bit()     smp_mb()
  128. #define smp_mb__after_clear_bit()      smp_mb()
  129. #define set_mb(var, value)      do { var = value; mb(); } while (0)
  130. #define set_wmb(var, value)     do { var = value; wmb(); } while (0)
  131. /* interrupt control.. */
  132. #define __sti() ({ 
  133.         unsigned long dummy; 
  134.         __asm__ __volatile__ ( 
  135.                 "stosm %0,0x03" : "=m" (dummy) : : "memory"); 
  136.         })
  137. #define __cli() ({ 
  138.         unsigned long flags; 
  139.         __asm__ __volatile__ ( 
  140.                 "stnsm %0,0xFC" : "=m" (flags) : : "memory"); 
  141.         flags; 
  142.         })
  143. #define __save_flags(x) 
  144.         __asm__ __volatile__("stosm %0,0" : "=m" (x) : : "memory")
  145. #define __restore_flags(x) 
  146.         __asm__ __volatile__("ssm   %0" : : "m" (x) : "memory")
  147. #define __load_psw(psw) 
  148.         __asm__ __volatile__("lpswe %0" : : "m" (psw) : "cc" );
  149. #define __ctl_load(array, low, high) ({ 
  150. __asm__ __volatile__ ( 
  151. "   la    1,%0n" 
  152. "   bras  2,0fn" 
  153.                 "   lctlg 0,0,0(1)n" 
  154. "0: ex    %1,0(2)" 
  155. : : "m" (array), "a" (((low)<<4)+(high)) : "1", "2" ); 
  156. })
  157. #define __ctl_store(array, low, high) ({ 
  158. __asm__ __volatile__ ( 
  159. "   la    1,%0n" 
  160. "   bras  2,0fn" 
  161. "   stctg 0,0,0(1)n" 
  162. "0: ex    %1,0(2)" 
  163. : "=m" (array) : "a" (((low)<<4)+(high)): "1", "2" ); 
  164. })
  165. #define __ctl_set_bit(cr, bit) ({ 
  166.         __u8 dummy[24]; 
  167.         __asm__ __volatile__ ( 
  168.                 "    la    1,%0n"       /* align to 8 byte */ 
  169.                 "    aghi  1,7n" 
  170.                 "    nill  1,0xfff8n" 
  171.                 "    bras  2,0fn"       /* skip indirect insns */ 
  172.                 "    stctg 0,0,0(1)n" 
  173.                 "    lctlg 0,0,0(1)n" 
  174.                 "0:  ex    %1,0(2)n"    /* execute stctl */ 
  175.                 "    lg    0,0(1)n" 
  176.                 "    ogr   0,%2n"       /* set the bit */ 
  177.                 "    stg   0,0(1)n" 
  178.                 "1:  ex    %1,6(2)"      /* execute lctl */ 
  179.                 : "=m" (dummy) : "a" (cr*17), "a" (1L<<(bit)) 
  180.                 : "cc", "0", "1", "2"); 
  181.         })
  182. #define __ctl_clear_bit(cr, bit) ({ 
  183.         __u8 dummy[24]; 
  184.         __asm__ __volatile__ ( 
  185.                 "    la    1,%0n"       /* align to 8 byte */ 
  186.                 "    aghi  1,7n" 
  187.                 "    nill  1,0xfff8n" 
  188.                 "    bras  2,0fn"       /* skip indirect insns */ 
  189.                 "    stctg 0,0,0(1)n" 
  190.                 "    lctlg 0,0,0(1)n" 
  191.                 "0:  ex    %1,0(2)n"    /* execute stctl */ 
  192.                 "    lg    0,0(1)n" 
  193.                 "    ngr   0,%2n"       /* set the bit */ 
  194.                 "    stg   0,0(1)n" 
  195.                 "1:  ex    %1,6(2)"      /* execute lctl */ 
  196.                 : "=m" (dummy) : "a" (cr*17), "a" (~(1L<<(bit))) 
  197.                 : "cc", "0", "1", "2"); 
  198.         })
  199. /* For spinlocks etc */
  200. #define local_irq_save(x) ((x) = __cli())
  201. #define local_irq_restore(x) __restore_flags(x)
  202. #define local_irq_disable() __cli()
  203. #define local_irq_enable() __sti()
  204. #ifdef CONFIG_SMP
  205. extern void __global_cli(void);
  206. extern void __global_sti(void);
  207. extern unsigned long __global_save_flags(void);
  208. extern void __global_restore_flags(unsigned long);
  209. #define cli() __global_cli()
  210. #define sti() __global_sti()
  211. #define save_flags(x) ((x)=__global_save_flags())
  212. #define restore_flags(x) __global_restore_flags(x)
  213. extern void smp_ctl_set_bit(int cr, int bit);
  214. extern void smp_ctl_clear_bit(int cr, int bit);
  215. #define ctl_set_bit(cr, bit) smp_ctl_set_bit(cr, bit)
  216. #define ctl_clear_bit(cr, bit) smp_ctl_clear_bit(cr, bit)
  217. #else
  218. #define cli() __cli()
  219. #define sti() __sti()
  220. #define save_flags(x) __save_flags(x)
  221. #define restore_flags(x) __restore_flags(x)
  222. #define ctl_set_bit(cr, bit) __ctl_set_bit(cr, bit)
  223. #define ctl_clear_bit(cr, bit) __ctl_clear_bit(cr, bit)
  224. #endif
  225. #ifdef __KERNEL__
  226. extern struct task_struct *resume(void *,void *);
  227. extern int save_fp_regs1(s390_fp_regs *fpregs);
  228. extern void save_fp_regs(s390_fp_regs *fpregs);
  229. extern int restore_fp_regs1(s390_fp_regs *fpregs);
  230. extern void restore_fp_regs(s390_fp_regs *fpregs);
  231. #endif
  232. #endif