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