1 /*
2 * thumb definition
3 */
4 #include <lib9.h>
5 #include <bio.h>
6 #include "uregt.h"
7 #include "mach.h"
8
9
10 #define REGOFF(x) (ulong) (&((struct Ureg *) 0)->x)
11
12 #define SP REGOFF(r13)
13 #define PC REGOFF(pc)
14
15 #define REGSIZE sizeof(struct Ureg)
16
17 Reglist thumbreglist[] =
18 {
19 {"LINK", REGOFF(link), RINT|RRDONLY, 'X'},
20 {"TYPE", REGOFF(type), RINT|RRDONLY, 'X'},
21 {"PSR", REGOFF(psr), RINT|RRDONLY, 'X'},
22 {"PC", PC, RINT, 'X'},
23 {"SP", SP, RINT, 'X'},
24 {"R15", PC, RINT, 'X'},
25 {"R14", REGOFF(r14), RINT, 'X'},
26 {"R13", REGOFF(r13), RINT, 'X'},
27 {"R12", REGOFF(r12), RINT, 'X'},
28 {"R11", REGOFF(r11), RINT, 'X'},
29 {"R10", REGOFF(r10), RINT, 'X'},
30 {"R9", REGOFF(r9), RINT, 'X'},
31 {"R8", REGOFF(r8), RINT, 'X'},
32 {"R7", REGOFF(r7), RINT, 'X'},
33 {"R6", REGOFF(r6), RINT, 'X'},
34 {"R5", REGOFF(r5), RINT, 'X'},
35 {"R4", REGOFF(r4), RINT, 'X'},
36 {"R3", REGOFF(r3), RINT, 'X'},
37 {"R2", REGOFF(r2), RINT, 'X'},
38 {"R1", REGOFF(r1), RINT, 'X'},
39 {"R0", REGOFF(r0), RINT, 'X'},
40 { 0 }
41 };
42
43 /* the machine description */
44 Mach mthumb =
45 {
46 "thumb",
47 MARM, /*MTHUMB,*/ /* machine type */
48 thumbreglist, /* register set */
49 REGSIZE, /* register set size */
50 0, /* fp register set size */
51 "PC", /* name of PC */
52 "SP", /* name of SP */
53 "R15", /* name of link register */
54 "setR12", /* static base register name */
55 0, /* static base register value */
56 0x1000, /* page size */
57 0x80000000, /* kernel base */
58 0, /* kernel text mask */
59 0x7FFFFFFF, /* stack top */
60 2, /* quantization of pc */
61 4, /* szaddr */
62 4, /* szreg */
63 4, /* szfloat */
64 8, /* szdouble */
65 };
66
67 typedef struct pcentry pcentry;
68
69 struct pcentry{
70 long start;
71 long stop;
72 };
73
74 static pcentry *pctab;
75 static int npctab;
76
77 void
thumbpctab(Biobuf * b,Fhdr * fp)78 thumbpctab(Biobuf *b, Fhdr *fp)
79 {
80 int n, o, ta;
81 uchar c[8];
82 pcentry *tab;
83
84 Bseek(b, fp->lnpcoff+fp->lnpcsz, 0);
85 o = (int)Boffset(b);
86 Bseek(b, 0, 2);
87 n = (int)Boffset(b)-o;
88 pctab = (pcentry*)malloc(n);
89 if(pctab == 0)
90 return;
91 ta = fp->txtaddr;
92 tab = pctab;
93 Bseek(b, fp->lnpcoff+fp->lnpcsz, 0);
94 while(Bread(b, c, sizeof(c)) == sizeof(c)){
95 tab->start = ta + (c[0]<<24)|(c[1]<<16)|(c[2]<<8)|c[3];
96 tab->stop = ta + (c[4]<<24)|(c[5]<<16)|(c[6]<<8)|c[7];
97 tab++;
98 }
99 npctab = n/sizeof(c);
100 }
101
102 int
thumbpclookup(uvlong pc)103 thumbpclookup(uvlong pc)
104 {
105 uvlong l, u, m;
106 pcentry *tab = pctab;
107
108 l = 0;
109 u = npctab-1;
110 while(l < u){
111 m = (l+u)/2;
112 if(pc < tab[m].start)
113 u = m-1;
114 else if(pc > tab[m].stop)
115 l = m+1;
116 else
117 l = u = m;
118 }
119 if(l == u && u < npctab && tab[u].start <= pc && pc <= tab[u].stop)
120 return 1; // thumb
121 return 0; // arm
122 }
123