]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/db/regs.c
audiohda: fix syntax error
[plan9front.git] / sys / src / cmd / db / regs.c
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 }