1 #ifndef _ASM_M68K_SETUP_H
 
   2 #define _ASM_M68K_SETUP_H
 
   5 #include <linux/linkage.h>
 
   7 /* Status Register bits */
 
   9 /* accrued exception bits */
 
  10 #define FPSR_AEXC_INEX  3
 
  11 #define FPSR_AEXC_DZ    4
 
  12 #define FPSR_AEXC_UNFL  5
 
  13 #define FPSR_AEXC_OVFL  6
 
  14 #define FPSR_AEXC_IOP   7
 
  16 /* exception status bits */
 
  17 #define FPSR_EXC_INEX1  8
 
  18 #define FPSR_EXC_INEX2  9
 
  19 #define FPSR_EXC_DZ     10
 
  20 #define FPSR_EXC_UNFL   11
 
  21 #define FPSR_EXC_OVFL   12
 
  22 #define FPSR_EXC_OPERR  13
 
  23 #define FPSR_EXC_SNAN   14
 
  24 #define FPSR_EXC_BSUN   15
 
  26 /* quotient byte, assumes big-endian, of course */
 
  27 #define FPSR_QUOTIENT(fpsr) (*((signed char *) &(fpsr) + 1))
 
  29 /* condition code bits */
 
  30 #define FPSR_CC_NAN     24
 
  31 #define FPSR_CC_INF     25
 
  33 #define FPSR_CC_NEG     27
 
  36 /* Control register bits */
 
  39 #define FPCR_ROUND_RN   0               /* round to nearest/even */
 
  40 #define FPCR_ROUND_RZ   1               /* round to zero */
 
  41 #define FPCR_ROUND_RM   2               /* minus infinity */
 
  42 #define FPCR_ROUND_RP   3               /* plus infinity */
 
  44 /* rounding precision */
 
  45 #define FPCR_PRECISION_X        0       /* long double */
 
  46 #define FPCR_PRECISION_S        1       /* double */
 
  47 #define FPCR_PRECISION_D        2       /* float */
 
  50 /* Flags to select the debugging output */
 
  60 #define PMDECODE        (1<<PDECODE)
 
  61 #define PMEXECUTE       (1<<PEXECUTE)
 
  62 #define PMCONV          (1<<PCONV)
 
  63 #define PMNORM          (1<<PNORM)
 
  64 #define PMREGISTER      (1<<PREGISTER)
 
  65 #define PMINSTR         (1<<PINSTR)
 
  66 #define PMUNIMPL        (1<<PUNIMPL)
 
  67 #define PMMOVEM         (1<<PMOVEM)
 
  71 #include <linux/kernel.h>
 
  72 #include <linux/sched.h>
 
  75         unsigned long long m64;
 
  80         unsigned long long m64[2];
 
  84 /* internal representation of extended fp numbers */
 
  86         unsigned char lowmant;
 
  92 /* C representation of FPU registers */
 
  93 /* NOTE: if you change this, you have to change the assembler offsets
 
  94    below and the size in <asm/fpu.h>, too */
 
  96         struct fp_ext fpreg[8];
 
 102         struct fp_ext temp[2];
 
 106 extern unsigned int fp_debugprint;
 
 108 #define dprint(bit, fmt, args...) ({                    \
 
 109         if (fp_debugprint & (1 << (bit)))               \
 
 110                 printk(fmt, ## args);                   \
 
 113 #define dprint(bit, fmt, args...)
 
 116 #define uprint(str) ({                                  \
 
 117         static int __count = 3;                         \
 
 120                 printk("You just hit an unimplemented " \
 
 121                        "fpu instruction (%s)\n", str);  \
 
 122                 printk("Please report this to ....\n"); \
 
 127 #define FPDATA          ((struct fp_data *)current->thread.fp)
 
 129 #else   /* __ASSEMBLY__ */
 
 133 /* offsets from the base register to the floating point data in the task struct */
 
 134 #define FPD_FPREG       (TASK_THREAD+THREAD_FPREG+0)
 
 135 #define FPD_FPCR        (TASK_THREAD+THREAD_FPREG+96)
 
 136 #define FPD_FPSR        (TASK_THREAD+THREAD_FPREG+100)
 
 137 #define FPD_FPIAR       (TASK_THREAD+THREAD_FPREG+104)
 
 138 #define FPD_PREC        (TASK_THREAD+THREAD_FPREG+108)
 
 139 #define FPD_RND         (TASK_THREAD+THREAD_FPREG+110)
 
 140 #define FPD_TEMPFP1     (TASK_THREAD+THREAD_FPREG+112)
 
 141 #define FPD_TEMPFP2     (TASK_THREAD+THREAD_FPREG+124)
 
 142 #define FPD_SIZEOF      (TASK_THREAD+THREAD_FPREG+136)
 
 144 /* offsets on the stack to access saved registers,
 
 145  * these are only used during instruction decoding
 
 146  * where we always know how deep we're on the stack.
 
 148 #define FPS_DO          (PT_D0)
 
 149 #define FPS_D1          (PT_D1)
 
 150 #define FPS_D2          (PT_D2)
 
 151 #define FPS_A0          (PT_A0)
 
 152 #define FPS_A1          (PT_A1)
 
 153 #define FPS_A2          (PT_A2)
 
 154 #define FPS_SR          (PT_SR)
 
 155 #define FPS_PC          (PT_PC)
 
 156 #define FPS_EA          (PT_PC+6)
 
 157 #define FPS_PC2         (PT_PC+10)
 
 160         lea     (FPD_FPREG,FPDATA,%d0.w*4),%a0
 
 161         lea     (%a0,%d0.w*8),%a0
 
 164 /* Macros used to get/put the current program counter.
 
 165  * 020/030 use a different stack frame then 040/060, for the
 
 166  * 040/060 the return pc points already to the next location,
 
 167  * so this only needs to be modified for jump instructions.
 
 169 .macro  fp_get_pc dest
 
 170         move.l  (FPS_PC+4,%sp),\dest
 
 173 .macro  fp_put_pc src,jump=0
 
 174         move.l  \src,(FPS_PC+4,%sp)
 
 177 .macro  fp_get_instr_data       f,s,dest,label
 
 178         getuser \f,%sp@(FPS_PC+4)@(0),\dest,\label,%sp@(FPS_PC+4)
 
 179         addq.l  #\s,%sp@(FPS_PC+4)
 
 182 .macro  fp_get_instr_word       dest,label,addr
 
 183         fp_get_instr_data       w,2,\dest,\label,\addr
 
 186 .macro  fp_get_instr_long       dest,label,addr
 
 187         fp_get_instr_data       l,4,\dest,\label,\addr
 
 190 /* These macros are used to read from/write to user space
 
 191  * on error we jump to the fixup section, load the fault
 
 192  * address into %a0 and jump to the exit.
 
 193  * (derived from <asm/uaccess.h>)
 
 195 .macro  getuser size,src,dest,label,addr
 
 196 |       printf  ,"[\size<%08x]",1,\addr
 
 197 .Lu1\@: moves\size      \src,\dest
 
 201 .Lu2\@: move.l  \addr,%a0
 
 205         .section __ex_table,"a"
 
 211 .macro  putuser size,src,dest,label,addr
 
 212 |       printf  ,"[\size>%08x]",1,\addr
 
 213 .Lu1\@: moves\size      \src,\dest
 
 218 .Lu3\@: move.l  \addr,%a0
 
 222         .section __ex_table,"a"
 
 229 /* work around binutils idiocy */
 
 236 .macro  getuser.\m src,dest,label,addr
 
 237         getuser .\m,\src,\dest,\label,\addr
 
 239 .macro  putuser.\m src,dest,label,addr
 
 240         putuser .\m,\src,\dest,\label,\addr
 
 245 .macro  movestack       nr,arg1,arg2,arg3,arg4,arg5
 
 247         movestack       (\nr-1),\arg2,\arg3,\arg4,\arg5
 
 252 .macro  printf  bit=-1,string,nr=0,arg1,arg2,arg3,arg4,arg5
 
 259         movem.l %d0/%d1/%a0/%a1,-(%sp)
 
 264         btst    %d0,fp_debugprint+((31-\bit)/8)
 
 266         btst    #\bit,fp_debugprint+((31-\bit)/8)
 
 270         movestack       \nr,\arg1,\arg2,\arg3,\arg4,\arg5
 
 273         lea     ((\nr+1)*4,%sp),%sp
 
 275         movem.l (%sp)+,%d0/%d1/%a0/%a1
 
 281         movem.l %d0/%a0,-(%sp)
 
 288 .Lx1\@: printf  \bit," %c",1,%d0
 
 294 .Lx2\@: printf  \bit,"1."
 
 295 .Lx3\@: printf  \bit,"%08x%08x",2,%d0,%a0@(8)
 
 298         printf  \bit,"E%04x",1,%d0
 
 300         printf  \bit," %08x%08x%08x",3,%a0@,%a0@(4),%a0@(8)
 
 302         movem.l (%sp)+,%d0/%a0
 
 306 .macro  debug   instr,args
 
 313 #endif  /* __ASSEMBLY__ */
 
 315 #endif  /* _ASM_M68K_SETUP_H */