github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/src/libmach/setmach.c (about) 1 // Inferno libmach/setmach.c 2 // http://code.google.com/p/inferno-os/source/browse/utils/libmach/setmach.c 3 // 4 // Copyright © 1994-1999 Lucent Technologies Inc. 5 // Power PC support Copyright © 1995-2004 C H Forsyth (forsyth@terzarima.net). 6 // Portions Copyright © 1997-1999 Vita Nuova Limited. 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). 8 // Revisions Copyright © 2000-2004 Lucent Technologies Inc. and others. 9 // Portions Copyright © 2009 The Go Authors. All rights reserved. 10 // 11 // Permission is hereby granted, free of charge, to any person obtaining a copy 12 // of this software and associated documentation files (the "Software"), to deal 13 // in the Software without restriction, including without limitation the rights 14 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 // copies of the Software, and to permit persons to whom the Software is 16 // furnished to do so, subject to the following conditions: 17 // 18 // The above copyright notice and this permission notice shall be included in 19 // all copies or substantial portions of the Software. 20 // 21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 // THE SOFTWARE. 28 29 #include <u.h> 30 #include <libc.h> 31 #include <bio.h> 32 #include <mach.h> 33 /* table for selecting machine-dependent parameters */ 34 35 typedef struct machtab Machtab; 36 37 struct machtab 38 { 39 char *name; /* machine name */ 40 short type; /* executable type */ 41 short boottype; /* bootable type */ 42 int asstype; /* disassembler code */ 43 Mach *mach; /* machine description */ 44 Machdata *machdata; /* machine functions */ 45 }; 46 47 /* 48 extern Mach mmips, msparc, m68020, mi386, mamd64, 49 marm, mmips2be, mmips2le, mpower, mpower64, malpha, msparc64; 50 extern Machdata mipsmach, sparcmach, m68020mach, i386mach, 51 armmach, mipsmach2le, powermach, alphamach, sparc64mach; 52 */ 53 extern Mach mi386, mamd64, marm; 54 extern Machdata i386mach, armmach; 55 56 /* 57 * machine selection table. machines with native disassemblers should 58 * follow the plan 9 variant in the table; native modes are selectable 59 * only by name. 60 */ 61 Machtab machines[] = 62 { 63 { "386", /*plan 9 386*/ 64 FI386, 65 FI386B, 66 AI386, 67 &mi386, 68 &i386mach, }, 69 { "amd64", /*amd64*/ 70 FAMD64, 71 FAMD64B, 72 AAMD64, 73 &mamd64, 74 &i386mach, }, 75 { "arm", /*ARM*/ 76 FARM, 77 FARMB, 78 AARM, 79 &marm, 80 &armmach, }, 81 #ifdef unused 82 { "68020", /*68020*/ 83 F68020, 84 F68020B, 85 A68020, 86 &m68020, 87 &m68020mach, }, 88 { "68020", /*Next 68040 bootable*/ 89 F68020, 90 FNEXTB, 91 A68020, 92 &m68020, 93 &m68020mach, }, 94 { "mips2LE", /*plan 9 mips2 little endian*/ 95 FMIPS2LE, 96 0, 97 AMIPS, 98 &mmips2le, 99 &mipsmach2le, }, 100 { "mips", /*plan 9 mips*/ 101 FMIPS, 102 FMIPSB, 103 AMIPS, 104 &mmips, 105 &mipsmach, }, 106 { "mips2", /*plan 9 mips2*/ 107 FMIPS2BE, 108 FMIPSB, 109 AMIPS, 110 &mmips2be, 111 &mipsmach, }, /* shares debuggers with native mips */ 112 { "mipsco", /*native mips - must follow plan 9*/ 113 FMIPS, 114 FMIPSB, 115 AMIPSCO, 116 &mmips, 117 &mipsmach, }, 118 { "sparc", /*plan 9 sparc */ 119 FSPARC, 120 FSPARCB, 121 ASPARC, 122 &msparc, 123 &sparcmach, }, 124 { "sunsparc", /*native sparc - must follow plan 9*/ 125 FSPARC, 126 FSPARCB, 127 ASUNSPARC, 128 &msparc, 129 &sparcmach, }, 130 { "86", /*8086 - a peach of a machine*/ 131 FI386, 132 FI386B, 133 AI8086, 134 &mi386, 135 &i386mach, }, 136 { "power", /*PowerPC*/ 137 FPOWER, 138 FPOWERB, 139 APOWER, 140 &mpower, 141 &powermach, }, 142 { "power64", /*PowerPC*/ 143 FPOWER64, 144 FPOWER64B, 145 APOWER64, 146 &mpower64, 147 &powermach, }, 148 { "alpha", /*Alpha*/ 149 FALPHA, 150 FALPHAB, 151 AALPHA, 152 &malpha, 153 &alphamach, }, 154 { "sparc64", /*plan 9 sparc64 */ 155 FSPARC64, 156 FSPARCB, /* XXX? */ 157 ASPARC64, 158 &msparc64, 159 &sparc64mach, }, 160 #endif 161 { 0 }, /*the terminator*/ 162 }; 163 164 /* 165 * select a machine by executable file type 166 */ 167 void 168 machbytype(int type) 169 { 170 Machtab *mp; 171 172 for (mp = machines; mp->name; mp++){ 173 if (mp->type == type || mp->boottype == type) { 174 asstype = mp->asstype; 175 machdata = mp->machdata; 176 break; 177 } 178 } 179 } 180 /* 181 * select a machine by name 182 */ 183 int 184 machbyname(char *name) 185 { 186 Machtab *mp; 187 188 if (!name) { 189 asstype = AAMD64; 190 machdata = &i386mach; 191 mach = &mamd64; 192 return 1; 193 } 194 for (mp = machines; mp->name; mp++){ 195 if (strcmp(mp->name, name) == 0) { 196 asstype = mp->asstype; 197 machdata = mp->machdata; 198 mach = mp->mach; 199 return 1; 200 } 201 } 202 return 0; 203 }