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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  arch/s390/kernel/s390fpu.c
  3.  *
  4.  *  S390 version
  5.  *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6.  *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
  7.  *
  8.  *  s390fpu.h functions for saving & restoring the fpu state.
  9.  *
  10.  *  I couldn't inline these as linux/sched.h included half the world
  11.  *  & was required to at the task structure.
  12.  *  & the functions were too complex to make macros from.
  13.  *  ( & as usual I didn't feel like debugging inline code ).
  14.  */
  15. #include <linux/sched.h>
  16. void save_fp_regs(s390_fp_regs *fpregs)
  17. {
  18. /*
  19.  * I don't think we can use STE here as this would load
  20.  * fp registers 0 & 2 into memory locations 0 & 1 etc. 
  21.  */
  22. asm volatile ("STFPC 0(%0)nt"
  23.       "STD   0,8(%0)nt"
  24.       "STD   1,16(%0)nt"
  25.       "STD   2,24(%0)nt"
  26.       "STD   3,32(%0)nt"
  27.       "STD   4,40(%0)nt"
  28.       "STD   5,48(%0)nt"
  29.       "STD   6,56(%0)nt"
  30.       "STD   7,64(%0)nt"
  31.       "STD   8,72(%0)nt"
  32.       "STD   9,80(%0)nt"
  33.       "STD   10,88(%0)nt"
  34.       "STD   11,96(%0)nt"
  35.       "STD   12,104(%0)nt"
  36.       "STD   13,112(%0)nt"
  37.       "STD   14,120(%0)nt"
  38.       "STD   15,128(%0)nt"
  39.                       : 
  40.       : "a" (fpregs)
  41.       : "memory"
  42. );
  43. }
  44. void restore_fp_regs(s390_fp_regs *fpregs)
  45. {
  46. /* If we don't mask with the FPC_VALID_MASK here
  47.  * we've got a very quick shutdown -h now command
  48.          * via a kernel specification exception.
  49.  */
  50. fpregs->fpc&=FPC_VALID_MASK;
  51. asm volatile ("LFPC 0(%0)nt"
  52.       "LD   0,8(%0)nt"
  53.       "LD   1,16(%0)nt"
  54.       "LD   2,24(%0)nt"
  55.       "LD   3,32(%0)nt"
  56.       "LD   4,40(%0)nt"
  57.       "LD   5,48(%0)nt"
  58.       "LD   6,56(%0)nt"
  59.       "LD   7,64(%0)nt"
  60.       "LD   8,72(%0)nt"
  61.       "LD   9,80(%0)nt"
  62.       "LD   10,88(%0)nt"
  63.       "LD   11,96(%0)nt"
  64.       "LD   12,104(%0)nt"
  65.       "LD   13,112(%0)nt"
  66.       "LD   14,120(%0)nt"
  67.       "LD   15,128(%0)nt"
  68.                       : 
  69.       : "a" (fpregs)
  70.       : "memory"
  71. );
  72. }