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