xref: /plan9-contrib/sys/src/libmach/setmach.c (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
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