1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <mach.h>
5 /* table for selecting machine-dependent parameters */
6
7 typedef struct machtab Machtab;
8
9 struct machtab
10 {
11 char *name; /* machine name */
12 short type; /* executable type */
13 short boottype; /* bootable type */
14 int asstype; /* disassembler code */
15 Mach *mach; /* machine description */
16 Machdata *machdata; /* machine functions */
17 };
18
19 extern Mach mmips, msparc, m68020, mi386, mamd64,
20 marm, mmips2be, mmips2le, mpower, mpower64, malpha, msparc64;
21 extern Machdata mipsmach, mipsmachle, sparcmach, m68020mach, i386mach,
22 armmach, mipsmach2le, powermach, alphamach, sparc64mach;
23
24 /*
25 * machine selection table. machines with native disassemblers should
26 * follow the plan 9 variant in the table; native modes are selectable
27 * only by name.
28 */
29 Machtab machines[] =
30 {
31 { "68020", /*68020*/
32 F68020,
33 F68020B,
34 A68020,
35 &m68020,
36 &m68020mach, },
37 { "68020", /*Next 68040 bootable*/
38 F68020,
39 FNEXTB,
40 A68020,
41 &m68020,
42 &m68020mach, },
43 { "mips2LE", /*plan 9 mips2 little endian*/
44 FMIPS2LE,
45 0,
46 AMIPS,
47 &mmips2le,
48 &mipsmach2le, },
49 { "mipsLE", /*plan 9 mips little endian*/
50 FMIPSLE,
51 0,
52 AMIPS,
53 &mmips,
54 &mipsmachle, },
55 { "mips", /*plan 9 mips*/
56 FMIPS,
57 FMIPSB,
58 AMIPS,
59 &mmips,
60 &mipsmach, },
61 { "mips2", /*plan 9 mips2*/
62 FMIPS2BE,
63 FMIPSB,
64 AMIPS,
65 &mmips2be,
66 &mipsmach, }, /* shares debuggers with native mips */
67 { "mipsco", /*native mips - must follow plan 9*/
68 FMIPS,
69 FMIPSB,
70 AMIPSCO,
71 &mmips,
72 &mipsmach, },
73 { "sparc", /*plan 9 sparc */
74 FSPARC,
75 FSPARCB,
76 ASPARC,
77 &msparc,
78 &sparcmach, },
79 { "sunsparc", /*native sparc - must follow plan 9*/
80 FSPARC,
81 FSPARCB,
82 ASUNSPARC,
83 &msparc,
84 &sparcmach, },
85 { "386", /*plan 9 386*/
86 FI386,
87 FI386B,
88 AI386,
89 &mi386,
90 &i386mach, },
91 { "86", /*8086 - a peach of a machine*/
92 FI386,
93 FI386B,
94 AI8086,
95 &mi386,
96 &i386mach, },
97 { "amd64", /*amd64*/
98 FAMD64,
99 FAMD64B,
100 AAMD64,
101 &mamd64,
102 &i386mach, },
103 { "arm", /*ARM*/
104 FARM,
105 FARMB,
106 AARM,
107 &marm,
108 &armmach, },
109 { "power", /*PowerPC*/
110 FPOWER,
111 FPOWERB,
112 APOWER,
113 &mpower,
114 &powermach, },
115 { "power64", /*PowerPC*/
116 FPOWER64,
117 FPOWER64B,
118 APOWER64,
119 &mpower64,
120 &powermach, },
121 { "alpha", /*Alpha*/
122 FALPHA,
123 FALPHAB,
124 AALPHA,
125 &malpha,
126 &alphamach, },
127 { "sparc64", /*plan 9 sparc64 */
128 FSPARC64,
129 FSPARCB, /* XXX? */
130 ASPARC64,
131 &msparc64,
132 &sparc64mach, },
133 { 0 }, /*the terminator*/
134 };
135
136 /*
137 * select a machine by executable file type
138 */
139 void
machbytype(int type)140 machbytype(int type)
141 {
142 Machtab *mp;
143
144 for (mp = machines; mp->name; mp++){
145 if (mp->type == type || mp->boottype == type) {
146 asstype = mp->asstype;
147 machdata = mp->machdata;
148 break;
149 }
150 }
151 }
152 /*
153 * select a machine by name
154 */
155 int
machbyname(char * name)156 machbyname(char *name)
157 {
158 Machtab *mp;
159
160 if (!name) {
161 asstype = AMIPS;
162 machdata = &mipsmach;
163 mach = &mmips;
164 return 1;
165 }
166 for (mp = machines; mp->name; mp++){
167 if (strcmp(mp->name, name) == 0) {
168 asstype = mp->asstype;
169 machdata = mp->machdata;
170 mach = mp->mach;
171 return 1;
172 }
173 }
174 return 0;
175 }
176