1*74a4d8c2SCharles.Forsyth /* 2*74a4d8c2SCharles.Forsyth * mips definition 3*74a4d8c2SCharles.Forsyth */ 4*74a4d8c2SCharles.Forsyth #include <lib9.h> 5*74a4d8c2SCharles.Forsyth #include <bio.h> 6*74a4d8c2SCharles.Forsyth #include "ureg4.h" 7*74a4d8c2SCharles.Forsyth #include "mach.h" 8*74a4d8c2SCharles.Forsyth 9*74a4d8c2SCharles.Forsyth #define FPREGBYTES 4 10*74a4d8c2SCharles.Forsyth #define REGOFF(x) (ulong)(&((struct Ureg *) 0)->x) 11*74a4d8c2SCharles.Forsyth 12*74a4d8c2SCharles.Forsyth #define SP REGOFF(u0.sp) 13*74a4d8c2SCharles.Forsyth #define PC REGOFF(pc) 14*74a4d8c2SCharles.Forsyth #define R1 REGOFF(hr1) 15*74a4d8c2SCharles.Forsyth #define R31 REGOFF(hr31) 16*74a4d8c2SCharles.Forsyth #define FP_REG(x) (R1+8+FPREGBYTES*(x)) 17*74a4d8c2SCharles.Forsyth 18*74a4d8c2SCharles.Forsyth #define REGSIZE sizeof(struct Ureg) 19*74a4d8c2SCharles.Forsyth #define FPREGSIZE (FPREGBYTES*33) 20*74a4d8c2SCharles.Forsyth 21*74a4d8c2SCharles.Forsyth Reglist mips2reglist[] = { 22*74a4d8c2SCharles.Forsyth {"STATUS", REGOFF(status), RINT|RRDONLY, 'X'}, 23*74a4d8c2SCharles.Forsyth {"CAUSE", REGOFF(cause), RINT|RRDONLY, 'X'}, 24*74a4d8c2SCharles.Forsyth {"BADVADDR", REGOFF(badvaddr), RINT|RRDONLY, 'X'}, 25*74a4d8c2SCharles.Forsyth {"TLBVIRT", REGOFF(tlbvirt), RINT|RRDONLY, 'X'}, 26*74a4d8c2SCharles.Forsyth {"HI", REGOFF(hhi), RINT|RRDONLY, 'Y'}, 27*74a4d8c2SCharles.Forsyth {"LO", REGOFF(hlo), RINT|RRDONLY, 'Y'}, 28*74a4d8c2SCharles.Forsyth {"PC", PC, RINT, 'X'}, 29*74a4d8c2SCharles.Forsyth {"SP", SP, RINT, 'X'}, 30*74a4d8c2SCharles.Forsyth {"R31", R31, RINT, 'Y'}, 31*74a4d8c2SCharles.Forsyth {"R30", REGOFF(hr30), RINT, 'Y'}, 32*74a4d8c2SCharles.Forsyth {"R28", REGOFF(hr28), RINT, 'Y'}, 33*74a4d8c2SCharles.Forsyth {"R27", REGOFF(hr27), RINT, 'Y'}, 34*74a4d8c2SCharles.Forsyth {"R26", REGOFF(hr26), RINT, 'Y'}, 35*74a4d8c2SCharles.Forsyth {"R25", REGOFF(hr25), RINT, 'Y'}, 36*74a4d8c2SCharles.Forsyth {"R24", REGOFF(hr24), RINT, 'Y'}, 37*74a4d8c2SCharles.Forsyth {"R23", REGOFF(hr23), RINT, 'Y'}, 38*74a4d8c2SCharles.Forsyth {"R22", REGOFF(hr22), RINT, 'Y'}, 39*74a4d8c2SCharles.Forsyth {"R21", REGOFF(hr21), RINT, 'Y'}, 40*74a4d8c2SCharles.Forsyth {"R20", REGOFF(hr20), RINT, 'Y'}, 41*74a4d8c2SCharles.Forsyth {"R19", REGOFF(hr19), RINT, 'Y'}, 42*74a4d8c2SCharles.Forsyth {"R18", REGOFF(hr18), RINT, 'Y'}, 43*74a4d8c2SCharles.Forsyth {"R17", REGOFF(hr17), RINT, 'Y'}, 44*74a4d8c2SCharles.Forsyth {"R16", REGOFF(hr16), RINT, 'Y'}, 45*74a4d8c2SCharles.Forsyth {"R15", REGOFF(hr15), RINT, 'Y'}, 46*74a4d8c2SCharles.Forsyth {"R14", REGOFF(hr14), RINT, 'Y'}, 47*74a4d8c2SCharles.Forsyth {"R13", REGOFF(hr13), RINT, 'Y'}, 48*74a4d8c2SCharles.Forsyth {"R12", REGOFF(hr12), RINT, 'Y'}, 49*74a4d8c2SCharles.Forsyth {"R11", REGOFF(hr11), RINT, 'Y'}, 50*74a4d8c2SCharles.Forsyth {"R10", REGOFF(hr10), RINT, 'Y'}, 51*74a4d8c2SCharles.Forsyth {"R9", REGOFF(hr9), RINT, 'Y'}, 52*74a4d8c2SCharles.Forsyth {"R8", REGOFF(hr8), RINT, 'Y'}, 53*74a4d8c2SCharles.Forsyth {"R7", REGOFF(hr7), RINT, 'Y'}, 54*74a4d8c2SCharles.Forsyth {"R6", REGOFF(hr6), RINT, 'Y'}, 55*74a4d8c2SCharles.Forsyth {"R5", REGOFF(hr5), RINT, 'Y'}, 56*74a4d8c2SCharles.Forsyth {"R4", REGOFF(hr4), RINT, 'Y'}, 57*74a4d8c2SCharles.Forsyth {"R3", REGOFF(hr3), RINT, 'Y'}, 58*74a4d8c2SCharles.Forsyth {"R2", REGOFF(hr2), RINT, 'Y'}, 59*74a4d8c2SCharles.Forsyth {"R1", REGOFF(hr1), RINT, 'Y'}, 60*74a4d8c2SCharles.Forsyth {"F0", FP_REG(0), RFLT, 'F'}, 61*74a4d8c2SCharles.Forsyth {"F1", FP_REG(1), RFLT, 'f'}, 62*74a4d8c2SCharles.Forsyth {"F2", FP_REG(2), RFLT, 'F'}, 63*74a4d8c2SCharles.Forsyth {"F3", FP_REG(3), RFLT, 'f'}, 64*74a4d8c2SCharles.Forsyth {"F4", FP_REG(4), RFLT, 'F'}, 65*74a4d8c2SCharles.Forsyth {"F5", FP_REG(5), RFLT, 'f'}, 66*74a4d8c2SCharles.Forsyth {"F6", FP_REG(6), RFLT, 'F'}, 67*74a4d8c2SCharles.Forsyth {"F7", FP_REG(7), RFLT, 'f'}, 68*74a4d8c2SCharles.Forsyth {"F8", FP_REG(8), RFLT, 'F'}, 69*74a4d8c2SCharles.Forsyth {"F9", FP_REG(9), RFLT, 'f'}, 70*74a4d8c2SCharles.Forsyth {"F10", FP_REG(10), RFLT, 'F'}, 71*74a4d8c2SCharles.Forsyth {"F11", FP_REG(11), RFLT, 'f'}, 72*74a4d8c2SCharles.Forsyth {"F12", FP_REG(12), RFLT, 'F'}, 73*74a4d8c2SCharles.Forsyth {"F13", FP_REG(13), RFLT, 'f'}, 74*74a4d8c2SCharles.Forsyth {"F14", FP_REG(14), RFLT, 'F'}, 75*74a4d8c2SCharles.Forsyth {"F15", FP_REG(15), RFLT, 'f'}, 76*74a4d8c2SCharles.Forsyth {"F16", FP_REG(16), RFLT, 'F'}, 77*74a4d8c2SCharles.Forsyth {"F17", FP_REG(17), RFLT, 'f'}, 78*74a4d8c2SCharles.Forsyth {"F18", FP_REG(18), RFLT, 'F'}, 79*74a4d8c2SCharles.Forsyth {"F19", FP_REG(19), RFLT, 'f'}, 80*74a4d8c2SCharles.Forsyth {"F20", FP_REG(20), RFLT, 'F'}, 81*74a4d8c2SCharles.Forsyth {"F21", FP_REG(21), RFLT, 'f'}, 82*74a4d8c2SCharles.Forsyth {"F22", FP_REG(22), RFLT, 'F'}, 83*74a4d8c2SCharles.Forsyth {"F23", FP_REG(23), RFLT, 'f'}, 84*74a4d8c2SCharles.Forsyth {"F24", FP_REG(24), RFLT, 'F'}, 85*74a4d8c2SCharles.Forsyth {"F25", FP_REG(25), RFLT, 'f'}, 86*74a4d8c2SCharles.Forsyth {"F26", FP_REG(26), RFLT, 'F'}, 87*74a4d8c2SCharles.Forsyth {"F27", FP_REG(27), RFLT, 'f'}, 88*74a4d8c2SCharles.Forsyth {"F28", FP_REG(28), RFLT, 'F'}, 89*74a4d8c2SCharles.Forsyth {"F29", FP_REG(29), RFLT, 'f'}, 90*74a4d8c2SCharles.Forsyth {"F30", FP_REG(30), RFLT, 'F'}, 91*74a4d8c2SCharles.Forsyth {"F31", FP_REG(31), RFLT, 'f'}, 92*74a4d8c2SCharles.Forsyth {"FPCR", FP_REG(32), RFLT, 'X'}, 93*74a4d8c2SCharles.Forsyth { 0 } 94*74a4d8c2SCharles.Forsyth }; 95*74a4d8c2SCharles.Forsyth 96*74a4d8c2SCharles.Forsyth /* the machine description */ 97*74a4d8c2SCharles.Forsyth Mach mmips2be = 98*74a4d8c2SCharles.Forsyth { 99*74a4d8c2SCharles.Forsyth "mips2", 100*74a4d8c2SCharles.Forsyth MMIPS2, /* machine type */ 101*74a4d8c2SCharles.Forsyth mips2reglist, /* register set */ 102*74a4d8c2SCharles.Forsyth REGSIZE, /* number of bytes in reg set */ 103*74a4d8c2SCharles.Forsyth FPREGSIZE, /* number of bytes in fp reg set */ 104*74a4d8c2SCharles.Forsyth "PC", /* name of PC */ 105*74a4d8c2SCharles.Forsyth "SP", /* name of SP */ 106*74a4d8c2SCharles.Forsyth "R31", /* name of link register */ 107*74a4d8c2SCharles.Forsyth "setR30", /* static base register name */ 108*74a4d8c2SCharles.Forsyth 0, /* SB value */ 109*74a4d8c2SCharles.Forsyth 0x1000, /* page size */ 110*74a4d8c2SCharles.Forsyth 0xC0000000, /* kernel base */ 111*74a4d8c2SCharles.Forsyth 0x40000000, /* kernel text mask */ 112*74a4d8c2SCharles.Forsyth 4, /* quantization of pc */ 113*74a4d8c2SCharles.Forsyth 4, /* szaddr */ 114*74a4d8c2SCharles.Forsyth 8, /* szreg */ 115*74a4d8c2SCharles.Forsyth 4, /* szfloat */ 116*74a4d8c2SCharles.Forsyth 8, /* szdouble */ 117*74a4d8c2SCharles.Forsyth }; 118*74a4d8c2SCharles.Forsyth 119*74a4d8c2SCharles.Forsyth Mach mmips2le = 120*74a4d8c2SCharles.Forsyth { 121*74a4d8c2SCharles.Forsyth "mips2", 122*74a4d8c2SCharles.Forsyth NMIPS2, /* machine type */ 123*74a4d8c2SCharles.Forsyth mips2reglist, /* register set */ 124*74a4d8c2SCharles.Forsyth REGSIZE, /* number of bytes in reg set */ 125*74a4d8c2SCharles.Forsyth FPREGSIZE, /* number of bytes in fp reg set */ 126*74a4d8c2SCharles.Forsyth "PC", /* name of PC */ 127*74a4d8c2SCharles.Forsyth "SP", /* name of SP */ 128*74a4d8c2SCharles.Forsyth "R31", /* name of link register */ 129*74a4d8c2SCharles.Forsyth "setR30", /* static base register name */ 130*74a4d8c2SCharles.Forsyth 0, /* SB value */ 131*74a4d8c2SCharles.Forsyth 0x1000, /* page size */ 132*74a4d8c2SCharles.Forsyth 0xC0000000, /* kernel base */ 133*74a4d8c2SCharles.Forsyth 0x40000000, /* kernel text mask */ 134*74a4d8c2SCharles.Forsyth 4, /* quantization of pc */ 135*74a4d8c2SCharles.Forsyth 4, /* szaddr */ 136*74a4d8c2SCharles.Forsyth 8, /* szreg */ 137*74a4d8c2SCharles.Forsyth 4, /* szfloat */ 138*74a4d8c2SCharles.Forsyth 8, /* szdouble */ 139*74a4d8c2SCharles.Forsyth }; 140