176 lines
3.1 KiB
C
176 lines
3.1 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
#include <bio.h>
|
|
#include <mach.h>
|
|
/* table for selecting machine-dependent parameters */
|
|
|
|
typedef struct machtab Machtab;
|
|
|
|
struct machtab
|
|
{
|
|
char *name; /* machine name */
|
|
short type; /* executable type */
|
|
short boottype; /* bootable type */
|
|
int asstype; /* disassembler code */
|
|
Mach *mach; /* machine description */
|
|
Machdata *machdata; /* machine functions */
|
|
};
|
|
|
|
extern Mach mmips, msparc, m68020, mi386, mamd64,
|
|
marm, marm64, mmips2be, mmips2le, mpower, mpower64, msparc64;
|
|
extern Machdata mipsmach, mipsmachle, sparcmach, m68020mach, i386mach,
|
|
armmach, arm64mach, mipsmach2le, powermach, sparc64mach;
|
|
|
|
/*
|
|
* machine selection table. machines with native disassemblers should
|
|
* follow the plan 9 variant in the table; native modes are selectable
|
|
* only by name.
|
|
*/
|
|
Machtab machines[] =
|
|
{
|
|
{ "68020", /*68020*/
|
|
F68020,
|
|
F68020B,
|
|
A68020,
|
|
&m68020,
|
|
&m68020mach, },
|
|
{ "68020", /*Next 68040 bootable*/
|
|
F68020,
|
|
FNEXTB,
|
|
A68020,
|
|
&m68020,
|
|
&m68020mach, },
|
|
{ "mips2LE", /*plan 9 mips2 little endian*/
|
|
FMIPS2LE,
|
|
0,
|
|
AMIPS,
|
|
&mmips2le,
|
|
&mipsmach2le, },
|
|
{ "mipsLE", /*plan 9 mips little endian*/
|
|
FMIPSLE,
|
|
0,
|
|
AMIPS,
|
|
&mmips,
|
|
&mipsmachle, },
|
|
{ "mips", /*plan 9 mips*/
|
|
FMIPS,
|
|
FMIPSB,
|
|
AMIPS,
|
|
&mmips,
|
|
&mipsmach, },
|
|
{ "mips2", /*plan 9 mips2*/
|
|
FMIPS2BE,
|
|
FMIPSB,
|
|
AMIPS,
|
|
&mmips2be,
|
|
&mipsmach, }, /* shares debuggers with native mips */
|
|
{ "mipsco", /*native mips - must follow plan 9*/
|
|
FMIPS,
|
|
FMIPSB,
|
|
AMIPSCO,
|
|
&mmips,
|
|
&mipsmach, },
|
|
{ "sparc", /*plan 9 sparc */
|
|
FSPARC,
|
|
FSPARCB,
|
|
ASPARC,
|
|
&msparc,
|
|
&sparcmach, },
|
|
{ "sunsparc", /*native sparc - must follow plan 9*/
|
|
FSPARC,
|
|
FSPARCB,
|
|
ASUNSPARC,
|
|
&msparc,
|
|
&sparcmach, },
|
|
{ "386", /*plan 9 386*/
|
|
FI386,
|
|
FI386B,
|
|
AI386,
|
|
&mi386,
|
|
&i386mach, },
|
|
{ "86", /*8086 - a peach of a machine*/
|
|
FI386,
|
|
FI386B,
|
|
AI8086,
|
|
&mi386,
|
|
&i386mach, },
|
|
{ "amd64", /*amd64*/
|
|
FAMD64,
|
|
FAMD64B,
|
|
AAMD64,
|
|
&mamd64,
|
|
&i386mach, },
|
|
{ "arm", /*ARM*/
|
|
FARM,
|
|
FARMB,
|
|
AARM,
|
|
&marm,
|
|
&armmach, },
|
|
{ "arm64", /*ARM64*/
|
|
FARM64,
|
|
FARM64B,
|
|
AARM64,
|
|
&marm64,
|
|
&arm64mach, },
|
|
{ "power", /*PowerPC*/
|
|
FPOWER,
|
|
FPOWERB,
|
|
APOWER,
|
|
&mpower,
|
|
&powermach, },
|
|
{ "power64", /*PowerPC*/
|
|
FPOWER64,
|
|
FPOWER64B,
|
|
APOWER64,
|
|
&mpower64,
|
|
&powermach, },
|
|
{ "sparc64", /*plan 9 sparc64 */
|
|
FSPARC64,
|
|
FSPARCB, /* XXX? */
|
|
ASPARC64,
|
|
&msparc64,
|
|
&sparc64mach, },
|
|
{ 0 }, /*the terminator*/
|
|
};
|
|
|
|
/*
|
|
* select a machine by executable file type
|
|
*/
|
|
void
|
|
machbytype(int type)
|
|
{
|
|
Machtab *mp;
|
|
|
|
for (mp = machines; mp->name; mp++){
|
|
if (mp->type == type || mp->boottype == type) {
|
|
asstype = mp->asstype;
|
|
machdata = mp->machdata;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
/*
|
|
* select a machine by name
|
|
*/
|
|
int
|
|
machbyname(char *name)
|
|
{
|
|
Machtab *mp;
|
|
|
|
if (!name) {
|
|
asstype = AMIPS;
|
|
machdata = &mipsmach;
|
|
mach = &mmips;
|
|
return 1;
|
|
}
|
|
for (mp = machines; mp->name; mp++){
|
|
if (strcmp(mp->name, name) == 0) {
|
|
asstype = mp->asstype;
|
|
machdata = mp->machdata;
|
|
mach = mp->mach;
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|