xref: /inferno-os/utils/libmach/setmach.c (revision a93f6c888f6d530420fbb54e2f7fa4572cdc5208)
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