system.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:9k
源码类别:

Linux/Unix编程

开发平台:

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