1 /* 2 * code to keep track of registers 3 */ 4 5 #include "defs.h" 6 #include "fns.h" 7 8 /* 9 * translate a name to a magic register offset 10 */ 11 Reglist* 12 rname(char *name) 13 { 14 Reglist *rp; 15 16 for (rp = mach->reglist; rp->rname; rp++) 17 if (strcmp(name, rp->rname) == 0) 18 return rp; 19 return 0; 20 } 21 22 static uvlong 23 getreg(Map *map, Reglist *rp) 24 { 25 uvlong v; 26 ulong w; 27 ushort s; 28 int ret; 29 30 v = 0; 31 ret = 0; 32 switch (rp->rformat) 33 { 34 case 'x': 35 ret = get2(map, rp->roffs, &s); 36 v = s; 37 break; 38 case 'f': 39 case 'X': 40 ret = get4(map, rp->roffs, &w); 41 v = w; 42 break; 43 case 'F': 44 case 'W': 45 case 'Y': 46 ret = get8(map, rp->roffs, &v); 47 break; 48 default: 49 werrstr("can't retrieve register %s", rp->rname); 50 error("%r"); 51 } 52 if (ret < 0) { 53 werrstr("Register %s: %r", rp->rname); 54 error("%r"); 55 } 56 return v; 57 } 58 59 uvlong 60 rget(Map *map, char *name) 61 { 62 Reglist *rp; 63 64 rp = rname(name); 65 if (!rp) 66 error("invalid register name"); 67 return getreg(map, rp); 68 } 69 70 void 71 rput(Map *map, char *name, vlong v) 72 { 73 Reglist *rp; 74 int ret; 75 76 rp = rname(name); 77 if (!rp) 78 error("invalid register name"); 79 if (rp->rflags & RRDONLY) 80 error("register is read-only"); 81 switch (rp->rformat) 82 { 83 case 'x': 84 ret = put2(map, rp->roffs, (ushort) v); 85 break; 86 case 'X': 87 case 'f': 88 case 'F': 89 ret = put4(map, rp->roffs, (long) v); 90 break; 91 case 'Y': 92 ret = put8(map, rp->roffs, v); 93 break; 94 default: 95 ret = -1; 96 } 97 if (ret < 0) 98 error("can't write register"); 99 } 100 /* 101 * print the registers 102 */ 103 void 104 printregs(int c) 105 { 106 Reglist *rp; 107 int i; 108 uvlong v; 109 110 for (i = 1, rp = mach->reglist; rp->rname; rp++, i++) { 111 if ((rp->rflags & RFLT)) { 112 if (c != 'R') 113 continue; 114 if (rp->rformat == '8' || rp->rformat == '3') 115 continue; 116 } 117 v = getreg(cormap, rp); 118 if(rp->rformat == 'Y') 119 dprint("%-8s %-20#llux", rp->rname, v); 120 else 121 dprint("%-8s %-12#lux", rp->rname, (ulong)v); 122 if ((i % 3) == 0) { 123 dprint("\n"); 124 i = 0; 125 } 126 } 127 if (i != 1) 128 dprint("\n"); 129 dprint ("%s\n", machdata->excep(cormap, rget)); 130 printpc(); 131 } 132