174a4d8c2SCharles.Forsyth #include <lib9.h>
274a4d8c2SCharles.Forsyth #include <bio.h>
374a4d8c2SCharles.Forsyth #include "mach.h"
474a4d8c2SCharles.Forsyth /* table for selecting machine-dependent parameters */
574a4d8c2SCharles.Forsyth
674a4d8c2SCharles.Forsyth typedef struct machtab Machtab;
774a4d8c2SCharles.Forsyth
874a4d8c2SCharles.Forsyth struct machtab
974a4d8c2SCharles.Forsyth {
1074a4d8c2SCharles.Forsyth char *name; /* machine name */
1174a4d8c2SCharles.Forsyth short type; /* executable type */
1274a4d8c2SCharles.Forsyth short boottype; /* bootable type */
1374a4d8c2SCharles.Forsyth int asstype; /* disassembler code */
1474a4d8c2SCharles.Forsyth Mach *mach; /* machine description */
1574a4d8c2SCharles.Forsyth Machdata *machdata; /* machine functions */
1674a4d8c2SCharles.Forsyth };
1774a4d8c2SCharles.Forsyth
1845a20ab7Sforsyth extern Mach mmips, msparc, mi386, mamd64,
19*2a571cc0SRichard Miller marm, mmips2be, mmips2le, mpower, mpower64, mriscv, mriscv64;
2045a20ab7Sforsyth extern Machdata mipsmach, sparcmach, i386mach,
21*2a571cc0SRichard Miller armmach, mipsmach2le, powermach, riscvmach, riscv64mach;
2274a4d8c2SCharles.Forsyth
2374a4d8c2SCharles.Forsyth /*
2474a4d8c2SCharles.Forsyth * machine selection table. machines with native disassemblers should
2574a4d8c2SCharles.Forsyth * follow the plan 9 variant in the table; native modes are selectable
2674a4d8c2SCharles.Forsyth * only by name.
2774a4d8c2SCharles.Forsyth */
2874a4d8c2SCharles.Forsyth Machtab machines[] =
2974a4d8c2SCharles.Forsyth {
3074a4d8c2SCharles.Forsyth { "mips2LE", /*plan 9 mips2 little endian*/
3174a4d8c2SCharles.Forsyth FMIPS2LE,
3274a4d8c2SCharles.Forsyth 0,
3374a4d8c2SCharles.Forsyth AMIPS,
3474a4d8c2SCharles.Forsyth &mmips2le,
3574a4d8c2SCharles.Forsyth &mipsmach2le, },
3674a4d8c2SCharles.Forsyth { "mips", /*plan 9 mips*/
3774a4d8c2SCharles.Forsyth FMIPS,
3874a4d8c2SCharles.Forsyth FMIPSB,
3974a4d8c2SCharles.Forsyth AMIPS,
4074a4d8c2SCharles.Forsyth &mmips,
4174a4d8c2SCharles.Forsyth &mipsmach, },
4274a4d8c2SCharles.Forsyth { "mips2", /*plan 9 mips2*/
4374a4d8c2SCharles.Forsyth FMIPS2BE,
4474a4d8c2SCharles.Forsyth FMIPSB,
4574a4d8c2SCharles.Forsyth AMIPS,
4674a4d8c2SCharles.Forsyth &mmips2be,
47773d7fd2Sforsyth &mipsmach, }, /* shares debuggers with native mips */
4874a4d8c2SCharles.Forsyth { "mipsco", /*native mips - must follow plan 9*/
4974a4d8c2SCharles.Forsyth FMIPS,
5074a4d8c2SCharles.Forsyth FMIPSB,
5174a4d8c2SCharles.Forsyth AMIPSCO,
5274a4d8c2SCharles.Forsyth &mmips,
5374a4d8c2SCharles.Forsyth &mipsmach, },
5474a4d8c2SCharles.Forsyth { "sparc", /*plan 9 sparc */
5574a4d8c2SCharles.Forsyth FSPARC,
5674a4d8c2SCharles.Forsyth FSPARCB,
5774a4d8c2SCharles.Forsyth ASPARC,
5874a4d8c2SCharles.Forsyth &msparc,
5974a4d8c2SCharles.Forsyth &sparcmach, },
6074a4d8c2SCharles.Forsyth { "sunsparc", /*native sparc - must follow plan 9*/
6174a4d8c2SCharles.Forsyth FSPARC,
6274a4d8c2SCharles.Forsyth FSPARCB,
6374a4d8c2SCharles.Forsyth ASUNSPARC,
6474a4d8c2SCharles.Forsyth &msparc,
6574a4d8c2SCharles.Forsyth &sparcmach, },
6674a4d8c2SCharles.Forsyth { "386", /*plan 9 386*/
6774a4d8c2SCharles.Forsyth FI386,
6874a4d8c2SCharles.Forsyth FI386B,
6974a4d8c2SCharles.Forsyth AI386,
7074a4d8c2SCharles.Forsyth &mi386,
7174a4d8c2SCharles.Forsyth &i386mach, },
7274a4d8c2SCharles.Forsyth { "86", /*8086 - a peach of a machine*/
7374a4d8c2SCharles.Forsyth FI386,
7474a4d8c2SCharles.Forsyth FI386B,
7574a4d8c2SCharles.Forsyth AI8086,
7674a4d8c2SCharles.Forsyth &mi386,
7774a4d8c2SCharles.Forsyth &i386mach, },
78773d7fd2Sforsyth { "amd64", /*amd64*/
79773d7fd2Sforsyth FAMD64,
80773d7fd2Sforsyth FAMD64B,
81773d7fd2Sforsyth AAMD64,
82773d7fd2Sforsyth &mamd64,
83773d7fd2Sforsyth &i386mach, },
8474a4d8c2SCharles.Forsyth { "arm", /*ARM*/
8574a4d8c2SCharles.Forsyth FARM,
86773d7fd2Sforsyth FARMB,
8774a4d8c2SCharles.Forsyth AARM,
8874a4d8c2SCharles.Forsyth &marm,
8974a4d8c2SCharles.Forsyth &armmach, },
9074a4d8c2SCharles.Forsyth { "power", /*PowerPC*/
9174a4d8c2SCharles.Forsyth FPOWER,
92773d7fd2Sforsyth FPOWERB,
9374a4d8c2SCharles.Forsyth APOWER,
9474a4d8c2SCharles.Forsyth &mpower,
9574a4d8c2SCharles.Forsyth &powermach, },
96773d7fd2Sforsyth { "power64", /*PowerPC*/
97773d7fd2Sforsyth FPOWER64,
98773d7fd2Sforsyth FPOWER64B,
99773d7fd2Sforsyth APOWER64,
100773d7fd2Sforsyth &mpower64,
101773d7fd2Sforsyth &powermach, },
102*2a571cc0SRichard Miller { "riscv",
103*2a571cc0SRichard Miller FRISCV,
104*2a571cc0SRichard Miller FRISCVB,
105*2a571cc0SRichard Miller ARISCV,
106*2a571cc0SRichard Miller &mriscv,
107*2a571cc0SRichard Miller &riscvmach, },
108*2a571cc0SRichard Miller { "riscv64",
109*2a571cc0SRichard Miller FRISCV64,
110*2a571cc0SRichard Miller FRISCV64B,
111*2a571cc0SRichard Miller ARISCV64,
112*2a571cc0SRichard Miller &mriscv64,
113*2a571cc0SRichard Miller &riscv64mach, },
11474a4d8c2SCharles.Forsyth { 0 }, /*the terminator*/
11574a4d8c2SCharles.Forsyth };
11674a4d8c2SCharles.Forsyth
11774a4d8c2SCharles.Forsyth /*
11874a4d8c2SCharles.Forsyth * select a machine by executable file type
11974a4d8c2SCharles.Forsyth */
12074a4d8c2SCharles.Forsyth void
machbytype(int type)12174a4d8c2SCharles.Forsyth machbytype(int type)
12274a4d8c2SCharles.Forsyth {
12374a4d8c2SCharles.Forsyth Machtab *mp;
12474a4d8c2SCharles.Forsyth
12574a4d8c2SCharles.Forsyth for (mp = machines; mp->name; mp++){
12674a4d8c2SCharles.Forsyth if (mp->type == type || mp->boottype == type) {
12774a4d8c2SCharles.Forsyth asstype = mp->asstype;
12874a4d8c2SCharles.Forsyth machdata = mp->machdata;
12974a4d8c2SCharles.Forsyth break;
13074a4d8c2SCharles.Forsyth }
13174a4d8c2SCharles.Forsyth }
13274a4d8c2SCharles.Forsyth }
13374a4d8c2SCharles.Forsyth /*
13474a4d8c2SCharles.Forsyth * select a machine by name
13574a4d8c2SCharles.Forsyth */
13674a4d8c2SCharles.Forsyth int
machbyname(char * name)13774a4d8c2SCharles.Forsyth machbyname(char *name)
13874a4d8c2SCharles.Forsyth {
13974a4d8c2SCharles.Forsyth Machtab *mp;
14074a4d8c2SCharles.Forsyth
14174a4d8c2SCharles.Forsyth if (!name) {
14274a4d8c2SCharles.Forsyth asstype = AMIPS;
14374a4d8c2SCharles.Forsyth machdata = &mipsmach;
14474a4d8c2SCharles.Forsyth mach = &mmips;
14574a4d8c2SCharles.Forsyth return 1;
14674a4d8c2SCharles.Forsyth }
14774a4d8c2SCharles.Forsyth for (mp = machines; mp->name; mp++){
14874a4d8c2SCharles.Forsyth if (strcmp(mp->name, name) == 0) {
14974a4d8c2SCharles.Forsyth asstype = mp->asstype;
15074a4d8c2SCharles.Forsyth machdata = mp->machdata;
15174a4d8c2SCharles.Forsyth mach = mp->mach;
15274a4d8c2SCharles.Forsyth return 1;
15374a4d8c2SCharles.Forsyth }
15474a4d8c2SCharles.Forsyth }
15574a4d8c2SCharles.Forsyth return 0;
15674a4d8c2SCharles.Forsyth }
157