1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include <mach.h>
5219b2ee8SDavid du Colombier /* table for selecting machine-dependent parameters */
6219b2ee8SDavid du Colombier
7219b2ee8SDavid du Colombier typedef struct machtab Machtab;
8219b2ee8SDavid du Colombier
9219b2ee8SDavid du Colombier struct machtab
10219b2ee8SDavid du Colombier {
11219b2ee8SDavid du Colombier char *name; /* machine name */
12219b2ee8SDavid du Colombier short type; /* executable type */
13219b2ee8SDavid du Colombier short boottype; /* bootable type */
14219b2ee8SDavid du Colombier int asstype; /* disassembler code */
15219b2ee8SDavid du Colombier Mach *mach; /* machine description */
16219b2ee8SDavid du Colombier Machdata *machdata; /* machine functions */
17219b2ee8SDavid du Colombier };
18219b2ee8SDavid du Colombier
19*ce95e1b3SDavid du Colombier extern Mach mmips, mmips64, msparc, m68020, mi386, mamd64, mriscv, mriscv64,
20f8bc6aafSDavid du Colombier marm, /* mmips2be, mmips2le, */ mpower, mpower64, malpha, msparc64;
21*ce95e1b3SDavid du Colombier extern Machdata mipsmach, mipsmachle, sparcmach, m68020mach, i386mach, riscvmach, riscv64mach,
228a34c8c5SDavid du Colombier armmach, mipsmach2le, powermach, alphamach, sparc64mach;
23219b2ee8SDavid du Colombier
24219b2ee8SDavid du Colombier /*
25219b2ee8SDavid du Colombier * machine selection table. machines with native disassemblers should
26219b2ee8SDavid du Colombier * follow the plan 9 variant in the table; native modes are selectable
27219b2ee8SDavid du Colombier * only by name.
28219b2ee8SDavid du Colombier */
29219b2ee8SDavid du Colombier Machtab machines[] =
30219b2ee8SDavid du Colombier {
31219b2ee8SDavid du Colombier { "68020", /*68020*/
32219b2ee8SDavid du Colombier F68020,
33219b2ee8SDavid du Colombier F68020B,
34219b2ee8SDavid du Colombier A68020,
35219b2ee8SDavid du Colombier &m68020,
36219b2ee8SDavid du Colombier &m68020mach, },
37219b2ee8SDavid du Colombier { "68020", /*Next 68040 bootable*/
38219b2ee8SDavid du Colombier F68020,
39219b2ee8SDavid du Colombier FNEXTB,
40219b2ee8SDavid du Colombier A68020,
41219b2ee8SDavid du Colombier &m68020,
42219b2ee8SDavid du Colombier &m68020mach, },
43f8bc6aafSDavid du Colombier { "mips64LE", /*plan 9 mips64 little endian*/
447dd7cddfSDavid du Colombier FMIPS2LE,
457dd7cddfSDavid du Colombier 0,
467dd7cddfSDavid du Colombier AMIPS,
47f8bc6aafSDavid du Colombier &mmips64,
487dd7cddfSDavid du Colombier &mipsmach2le, },
49850026d1SDavid du Colombier { "mipsLE", /*plan 9 mips little endian*/
50850026d1SDavid du Colombier FMIPSLE,
51850026d1SDavid du Colombier 0,
52850026d1SDavid du Colombier AMIPS,
53850026d1SDavid du Colombier &mmips,
54850026d1SDavid du Colombier &mipsmachle, },
55219b2ee8SDavid du Colombier { "mips", /*plan 9 mips*/
56219b2ee8SDavid du Colombier FMIPS,
57219b2ee8SDavid du Colombier FMIPSB,
58219b2ee8SDavid du Colombier AMIPS,
59219b2ee8SDavid du Colombier &mmips,
60219b2ee8SDavid du Colombier &mipsmach, },
61f8bc6aafSDavid du Colombier { "mips64", /*plan 9 mips64*/
627dd7cddfSDavid du Colombier FMIPS2BE,
637dd7cddfSDavid du Colombier FMIPSB,
647dd7cddfSDavid du Colombier AMIPS,
65f8bc6aafSDavid du Colombier &mmips64,
667dd7cddfSDavid du Colombier &mipsmach, }, /* shares debuggers with native mips */
67219b2ee8SDavid du Colombier { "mipsco", /*native mips - must follow plan 9*/
68219b2ee8SDavid du Colombier FMIPS,
69219b2ee8SDavid du Colombier FMIPSB,
70219b2ee8SDavid du Colombier AMIPSCO,
71219b2ee8SDavid du Colombier &mmips,
72219b2ee8SDavid du Colombier &mipsmach, },
73219b2ee8SDavid du Colombier { "sparc", /*plan 9 sparc */
74219b2ee8SDavid du Colombier FSPARC,
75219b2ee8SDavid du Colombier FSPARCB,
76219b2ee8SDavid du Colombier ASPARC,
77219b2ee8SDavid du Colombier &msparc,
78219b2ee8SDavid du Colombier &sparcmach, },
79219b2ee8SDavid du Colombier { "sunsparc", /*native sparc - must follow plan 9*/
80219b2ee8SDavid du Colombier FSPARC,
81219b2ee8SDavid du Colombier FSPARCB,
82219b2ee8SDavid du Colombier ASUNSPARC,
83219b2ee8SDavid du Colombier &msparc,
84219b2ee8SDavid du Colombier &sparcmach, },
85219b2ee8SDavid du Colombier { "386", /*plan 9 386*/
86219b2ee8SDavid du Colombier FI386,
87219b2ee8SDavid du Colombier FI386B,
88219b2ee8SDavid du Colombier AI386,
89219b2ee8SDavid du Colombier &mi386,
90219b2ee8SDavid du Colombier &i386mach, },
91219b2ee8SDavid du Colombier { "86", /*8086 - a peach of a machine*/
92219b2ee8SDavid du Colombier FI386,
93219b2ee8SDavid du Colombier FI386B,
94219b2ee8SDavid du Colombier AI8086,
95219b2ee8SDavid du Colombier &mi386,
96219b2ee8SDavid du Colombier &i386mach, },
97b0dcc5a8SDavid du Colombier { "amd64", /*amd64*/
98b0dcc5a8SDavid du Colombier FAMD64,
996c0bae65SDavid du Colombier FAMD64B,
100b0dcc5a8SDavid du Colombier AAMD64,
101b0dcc5a8SDavid du Colombier &mamd64,
102b0dcc5a8SDavid du Colombier &i386mach, },
1037dd7cddfSDavid du Colombier { "arm", /*ARM*/
1047dd7cddfSDavid du Colombier FARM,
10541fb754aSDavid du Colombier FARMB,
1067dd7cddfSDavid du Colombier AARM,
1077dd7cddfSDavid du Colombier &marm,
1087dd7cddfSDavid du Colombier &armmach, },
1097dd7cddfSDavid du Colombier { "power", /*PowerPC*/
1107dd7cddfSDavid du Colombier FPOWER,
1117dd7cddfSDavid du Colombier FPOWERB,
1127dd7cddfSDavid du Colombier APOWER,
1137dd7cddfSDavid du Colombier &mpower,
1147dd7cddfSDavid du Colombier &powermach, },
11547ad9175SDavid du Colombier { "power64", /*PowerPC*/
11647ad9175SDavid du Colombier FPOWER64,
11747ad9175SDavid du Colombier FPOWER64B,
11847ad9175SDavid du Colombier APOWER64,
11947ad9175SDavid du Colombier &mpower64,
12047ad9175SDavid du Colombier &powermach, },
1218a34c8c5SDavid du Colombier { "alpha", /*Alpha*/
1228a34c8c5SDavid du Colombier FALPHA,
1238a34c8c5SDavid du Colombier FALPHAB,
1248a34c8c5SDavid du Colombier AALPHA,
1258a34c8c5SDavid du Colombier &malpha,
1268a34c8c5SDavid du Colombier &alphamach, },
127b0dcc5a8SDavid du Colombier { "sparc64", /*plan 9 sparc64 */
128b0dcc5a8SDavid du Colombier FSPARC64,
129b0dcc5a8SDavid du Colombier FSPARCB, /* XXX? */
130b0dcc5a8SDavid du Colombier ASPARC64,
131b0dcc5a8SDavid du Colombier &msparc64,
132b0dcc5a8SDavid du Colombier &sparc64mach, },
133*ce95e1b3SDavid du Colombier { "riscv",
134*ce95e1b3SDavid du Colombier FRISCV,
135*ce95e1b3SDavid du Colombier FRISCVB,
136*ce95e1b3SDavid du Colombier ARISCV,
137*ce95e1b3SDavid du Colombier &mriscv,
138*ce95e1b3SDavid du Colombier &riscvmach, },
139*ce95e1b3SDavid du Colombier { "riscv64",
140*ce95e1b3SDavid du Colombier FRISCV64,
141*ce95e1b3SDavid du Colombier FRISCV64B,
142*ce95e1b3SDavid du Colombier ARISCV64,
143*ce95e1b3SDavid du Colombier &mriscv64,
144*ce95e1b3SDavid du Colombier &riscv64mach, },
145219b2ee8SDavid du Colombier { 0 }, /*the terminator*/
146219b2ee8SDavid du Colombier };
147219b2ee8SDavid du Colombier
148219b2ee8SDavid du Colombier /*
149219b2ee8SDavid du Colombier * select a machine by executable file type
150219b2ee8SDavid du Colombier */
151219b2ee8SDavid du Colombier void
machbytype(int type)152219b2ee8SDavid du Colombier machbytype(int type)
153219b2ee8SDavid du Colombier {
154219b2ee8SDavid du Colombier Machtab *mp;
155219b2ee8SDavid du Colombier
156219b2ee8SDavid du Colombier for (mp = machines; mp->name; mp++){
157219b2ee8SDavid du Colombier if (mp->type == type || mp->boottype == type) {
158219b2ee8SDavid du Colombier asstype = mp->asstype;
159219b2ee8SDavid du Colombier machdata = mp->machdata;
160219b2ee8SDavid du Colombier break;
161219b2ee8SDavid du Colombier }
162219b2ee8SDavid du Colombier }
163219b2ee8SDavid du Colombier }
164219b2ee8SDavid du Colombier /*
165219b2ee8SDavid du Colombier * select a machine by name
166219b2ee8SDavid du Colombier */
167219b2ee8SDavid du Colombier int
machbyname(char * name)168219b2ee8SDavid du Colombier machbyname(char *name)
169219b2ee8SDavid du Colombier {
170219b2ee8SDavid du Colombier Machtab *mp;
171219b2ee8SDavid du Colombier
172219b2ee8SDavid du Colombier if (!name) {
173219b2ee8SDavid du Colombier asstype = AMIPS;
174219b2ee8SDavid du Colombier machdata = &mipsmach;
175219b2ee8SDavid du Colombier mach = &mmips;
176219b2ee8SDavid du Colombier return 1;
177219b2ee8SDavid du Colombier }
178219b2ee8SDavid du Colombier for (mp = machines; mp->name; mp++){
179219b2ee8SDavid du Colombier if (strcmp(mp->name, name) == 0) {
180219b2ee8SDavid du Colombier asstype = mp->asstype;
181219b2ee8SDavid du Colombier machdata = mp->machdata;
182219b2ee8SDavid du Colombier mach = mp->mach;
183219b2ee8SDavid du Colombier return 1;
184219b2ee8SDavid du Colombier }
185219b2ee8SDavid du Colombier }
186219b2ee8SDavid du Colombier return 0;
187219b2ee8SDavid du Colombier }
188