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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * arch/ppc64/kernel/ppc_asm.h
  3.  *
  4.  * Definitions used by various bits of low-level assembly code on PowerPC.
  5.  *
  6.  * Copyright (C) 1995-1999 Gary Thomas, Paul Mackerras, Cort Dougan.
  7.  *
  8.  *  This program is free software; you can redistribute it and/or
  9.  *  modify it under the terms of the GNU General Public License
  10.  *  as published by the Free Software Foundation; either version
  11.  *  2 of the License, or (at your option) any later version.
  12.  */
  13. #include <linux/config.h>
  14. #include <asm/ppc_asm.tmpl>
  15. #include "ppc_defs.h"
  16. /*
  17.  * Macros for storing registers into and loading registers from
  18.  * exception frames.
  19.  */
  20. #define SAVE_GPR(n, base) std n,GPR0+8*(n)(base)
  21. #define SAVE_2GPRS(n, base) SAVE_GPR(n, base); SAVE_GPR(n+1, base)
  22. #define SAVE_4GPRS(n, base) SAVE_2GPRS(n, base); SAVE_2GPRS(n+2, base)
  23. #define SAVE_8GPRS(n, base) SAVE_4GPRS(n, base); SAVE_4GPRS(n+4, base)
  24. #define SAVE_10GPRS(n, base) SAVE_8GPRS(n, base); SAVE_2GPRS(n+8, base)
  25. #define REST_GPR(n, base) ld n,GPR0+8*(n)(base)
  26. #define REST_2GPRS(n, base) REST_GPR(n, base); REST_GPR(n+1, base)
  27. #define REST_4GPRS(n, base) REST_2GPRS(n, base); REST_2GPRS(n+2, base)
  28. #define REST_8GPRS(n, base) REST_4GPRS(n, base); REST_4GPRS(n+4, base)
  29. #define REST_10GPRS(n, base) REST_8GPRS(n, base); REST_2GPRS(n+8, base)
  30. #define SAVE_FPR(n, base) stfd n,THREAD_FPR0+8*(n)(base)
  31. #define SAVE_2FPRS(n, base) SAVE_FPR(n, base); SAVE_FPR(n+1, base)
  32. #define SAVE_4FPRS(n, base) SAVE_2FPRS(n, base); SAVE_2FPRS(n+2, base)
  33. #define SAVE_8FPRS(n, base) SAVE_4FPRS(n, base); SAVE_4FPRS(n+4, base)
  34. #define SAVE_16FPRS(n, base) SAVE_8FPRS(n, base); SAVE_8FPRS(n+8, base)
  35. #define SAVE_32FPRS(n, base) SAVE_16FPRS(n, base); SAVE_16FPRS(n+16, base)
  36. #define REST_FPR(n, base) lfd n,THREAD_FPR0+8*(n)(base)
  37. #define REST_2FPRS(n, base) REST_FPR(n, base); REST_FPR(n+1, base)
  38. #define REST_4FPRS(n, base) REST_2FPRS(n, base); REST_2FPRS(n+2, base)
  39. #define REST_8FPRS(n, base) REST_4FPRS(n, base); REST_4FPRS(n+4, base)
  40. #define REST_16FPRS(n, base) REST_8FPRS(n, base); REST_8FPRS(n+8, base)
  41. #define REST_32FPRS(n, base) REST_16FPRS(n, base); REST_16FPRS(n+16, base)
  42. #define CHECKANYINT(ra,rb)
  43. mfspr rb,SPRG3; /* Get Paca address */
  44. ld ra,PACALPPACA+LPPACAANYINT(rb); /* Get pending interrupt flags */
  45. cmpldi 0,ra,0;
  46. /* Macros to adjust thread priority for Iseries hardware multithreading */
  47. #define HMT_LOW or 1,1,1
  48. #define HMT_MEDIUM or 2,2,2
  49. #define HMT_HIGH or 3,3,3
  50. /* Insert the high 32 bits of the MSR into what will be the new
  51.    MSR (via SRR1 and rfid)  This preserves the MSR.SF and MSR.ISF
  52.    bits. */
  53. #define FIX_SRR1(ra, rb)
  54. mr rb,ra;
  55. mfmsr ra;
  56. rldimi ra,rb,0,32
  57. #define CLR_TOP32(r) rlwinm (r),(r),0,0,31 /* clear top 32 bits */
  58. /* 
  59.  * LOADADDR( rn, name )
  60.  *   loads the address of 'name' into 'rn'
  61.  *
  62.  * LOADBASE( rn, name )
  63.  *   loads the address (less the low 16 bits) of 'name' into 'rn'
  64.  *   suitable for base+disp addressing
  65.  */
  66. #define LOADADDR(rn,name) 
  67. lis rn,name##@highest;
  68. ori rn,rn,name##@higher;
  69. rldicr rn,rn,32,31;
  70. oris rn,rn,name##@h;
  71. ori rn,rn,name##@l
  72. #define LOADBASE(rn,name) 
  73. lis rn,name@highest;
  74. ori rn,rn,name@higher;
  75. rldicr rn,rn,32,31;
  76. oris rn,rn,name@ha
  77. #define SET_REG_TO_CONST(reg, value)          
  78. lis     reg,(((value)>>48)&0xFFFF);             
  79. ori     reg,reg,(((value)>>32)&0xFFFF);         
  80. rldicr  reg,reg,32,31;                          
  81. oris    reg,reg,(((value)>>16)&0xFFFF);         
  82. ori     reg,reg,((value)&0xFFFF);
  83. #define SET_REG_TO_LABEL(reg, label)          
  84. lis     reg,(label)@highest;                    
  85. ori     reg,reg,(label)@higher;                 
  86. rldicr  reg,reg,32,31;                          
  87. oris    reg,reg,(label)@h;                      
  88. ori     reg,reg,(label)@l;
  89. /* PPPBBB - DRENG  If KERNELBASE is always 0xC0...,
  90.  * Then we can easily do this with one asm insn. -Peter
  91.  */
  92. #define tophys(rd,rs)                           
  93.         lis     rd,((KERNELBASE>>48)&0xFFFF);   
  94.         rldicr  rd,rd,32,31;                    
  95.         sub     rd,rs,rd
  96. #define tovirt(rd,rs)                           
  97.         lis     rd,((KERNELBASE>>48)&0xFFFF);   
  98.         rldicr  rd,rd,32,31;                    
  99.         add     rd,rs,rd