xref: /plan9-contrib/sys/src/libmach/setmach.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include	<u.h>
2*219b2ee8SDavid du Colombier #include	<libc.h>
3*219b2ee8SDavid du Colombier #include	<bio.h>
4*219b2ee8SDavid du Colombier #include	<mach.h>
5*219b2ee8SDavid du Colombier 		/* table for selecting machine-dependent parameters */
6*219b2ee8SDavid du Colombier 
7*219b2ee8SDavid du Colombier typedef	struct machtab Machtab;
8*219b2ee8SDavid du Colombier 
9*219b2ee8SDavid du Colombier struct machtab
10*219b2ee8SDavid du Colombier {
11*219b2ee8SDavid du Colombier 	char		*name;			/* machine name */
12*219b2ee8SDavid du Colombier 	short		type;			/* executable type */
13*219b2ee8SDavid du Colombier 	short		boottype;		/* bootable type */
14*219b2ee8SDavid du Colombier 	int		asstype;		/* disassembler code */
15*219b2ee8SDavid du Colombier 	Mach		*mach;			/* machine description */
16*219b2ee8SDavid du Colombier 	Machdata	*machdata;		/* machine functions */
17*219b2ee8SDavid du Colombier };
18*219b2ee8SDavid du Colombier 
19*219b2ee8SDavid du Colombier extern	Mach		mmips, msparc, m68020, mi386, mi960;
20*219b2ee8SDavid du Colombier extern	Machdata	mipsmach, sparcmach, m68020mach, i386mach, i960mach;
21*219b2ee8SDavid du Colombier 
22*219b2ee8SDavid du Colombier /*
23*219b2ee8SDavid du Colombier  *	machine selection table.  machines with native disassemblers should
24*219b2ee8SDavid du Colombier  *	follow the plan 9 variant in the table; native modes are selectable
25*219b2ee8SDavid du Colombier  *	only by name.
26*219b2ee8SDavid du Colombier  */
27*219b2ee8SDavid du Colombier Machtab	machines[] =
28*219b2ee8SDavid du Colombier {
29*219b2ee8SDavid du Colombier 	{	"68020",			/*68020*/
30*219b2ee8SDavid du Colombier 		F68020,
31*219b2ee8SDavid du Colombier 		F68020B,
32*219b2ee8SDavid du Colombier 		A68020,
33*219b2ee8SDavid du Colombier 		&m68020,
34*219b2ee8SDavid du Colombier 		&m68020mach,	},
35*219b2ee8SDavid du Colombier 	{	"68020",			/*Next 68040 bootable*/
36*219b2ee8SDavid du Colombier 		F68020,
37*219b2ee8SDavid du Colombier 		FNEXTB,
38*219b2ee8SDavid du Colombier 		A68020,
39*219b2ee8SDavid du Colombier 		&m68020,
40*219b2ee8SDavid du Colombier 		&m68020mach,	},
41*219b2ee8SDavid du Colombier 	{	"mips",				/*plan 9 mips*/
42*219b2ee8SDavid du Colombier 		FMIPS,
43*219b2ee8SDavid du Colombier 		FMIPSB,
44*219b2ee8SDavid du Colombier 		AMIPS,
45*219b2ee8SDavid du Colombier 		&mmips,
46*219b2ee8SDavid du Colombier 		&mipsmach, 	},
47*219b2ee8SDavid du Colombier 	{	"mipsco",			/*native mips - must follow plan 9*/
48*219b2ee8SDavid du Colombier 		FMIPS,
49*219b2ee8SDavid du Colombier 		FMIPSB,
50*219b2ee8SDavid du Colombier 		AMIPSCO,
51*219b2ee8SDavid du Colombier 		&mmips,
52*219b2ee8SDavid du Colombier 		&mipsmach,	},
53*219b2ee8SDavid du Colombier 	{	"sparc",			/*plan 9 sparc */
54*219b2ee8SDavid du Colombier 		FSPARC,
55*219b2ee8SDavid du Colombier 		FSPARCB,
56*219b2ee8SDavid du Colombier 		ASPARC,
57*219b2ee8SDavid du Colombier 		&msparc,
58*219b2ee8SDavid du Colombier 		&sparcmach,	},
59*219b2ee8SDavid du Colombier 	{	"sunsparc",			/*native sparc - must follow plan 9*/
60*219b2ee8SDavid du Colombier 		FSPARC,
61*219b2ee8SDavid du Colombier 		FSPARCB,
62*219b2ee8SDavid du Colombier 		ASUNSPARC,
63*219b2ee8SDavid du Colombier 		&msparc,
64*219b2ee8SDavid du Colombier 		&sparcmach,	},
65*219b2ee8SDavid du Colombier 	{	"386",				/*plan 9 386*/
66*219b2ee8SDavid du Colombier 		FI386,
67*219b2ee8SDavid du Colombier 		FI386B,
68*219b2ee8SDavid du Colombier 		AI386,
69*219b2ee8SDavid du Colombier 		&mi386,
70*219b2ee8SDavid du Colombier 		&i386mach,	},
71*219b2ee8SDavid du Colombier 	{	"86",				/*8086 - a peach of a machine*/
72*219b2ee8SDavid du Colombier 		FI386,
73*219b2ee8SDavid du Colombier 		FI386B,
74*219b2ee8SDavid du Colombier 		AI8086,
75*219b2ee8SDavid du Colombier 		&mi386,
76*219b2ee8SDavid du Colombier 		&i386mach,	},
77*219b2ee8SDavid du Colombier 	{	"960",				/*i960*/
78*219b2ee8SDavid du Colombier 		FI960,
79*219b2ee8SDavid du Colombier 		FI960B,
80*219b2ee8SDavid du Colombier 		AI960,
81*219b2ee8SDavid du Colombier 		&mi960,
82*219b2ee8SDavid du Colombier 		&i960mach,	},
83*219b2ee8SDavid du Colombier 	{	0		},		/*the terminator*/
84*219b2ee8SDavid du Colombier };
85*219b2ee8SDavid du Colombier 
86*219b2ee8SDavid du Colombier /*
87*219b2ee8SDavid du Colombier  *	select a machine by executable file type
88*219b2ee8SDavid du Colombier  */
89*219b2ee8SDavid du Colombier void
90*219b2ee8SDavid du Colombier machbytype(int type)
91*219b2ee8SDavid du Colombier {
92*219b2ee8SDavid du Colombier 	Machtab *mp;
93*219b2ee8SDavid du Colombier 
94*219b2ee8SDavid du Colombier 	for (mp = machines; mp->name; mp++){
95*219b2ee8SDavid du Colombier 		if (mp->type == type || mp->boottype == type) {
96*219b2ee8SDavid du Colombier 			asstype = mp->asstype;
97*219b2ee8SDavid du Colombier 			machdata = mp->machdata;
98*219b2ee8SDavid du Colombier 			break;
99*219b2ee8SDavid du Colombier 		}
100*219b2ee8SDavid du Colombier 	}
101*219b2ee8SDavid du Colombier }
102*219b2ee8SDavid du Colombier /*
103*219b2ee8SDavid du Colombier  *	select a machine by name
104*219b2ee8SDavid du Colombier  */
105*219b2ee8SDavid du Colombier int
106*219b2ee8SDavid du Colombier machbyname(char *name)
107*219b2ee8SDavid du Colombier {
108*219b2ee8SDavid du Colombier 	Machtab *mp;
109*219b2ee8SDavid du Colombier 
110*219b2ee8SDavid du Colombier 	if (!name) {
111*219b2ee8SDavid du Colombier 		asstype = AMIPS;
112*219b2ee8SDavid du Colombier 		machdata = &mipsmach;
113*219b2ee8SDavid du Colombier 		mach = &mmips;
114*219b2ee8SDavid du Colombier 		return 1;
115*219b2ee8SDavid du Colombier 	}
116*219b2ee8SDavid du Colombier 	for (mp = machines; mp->name; mp++){
117*219b2ee8SDavid du Colombier 		if (strcmp(mp->name, name) == 0) {
118*219b2ee8SDavid du Colombier 			asstype = mp->asstype;
119*219b2ee8SDavid du Colombier 			machdata = mp->machdata;
120*219b2ee8SDavid du Colombier 			mach = mp->mach;
121*219b2ee8SDavid du Colombier 			return 1;
122*219b2ee8SDavid du Colombier 		}
123*219b2ee8SDavid du Colombier 	}
124*219b2ee8SDavid du Colombier 	return 0;
125*219b2ee8SDavid du Colombier }
126