// Inferno libmach/setmach.c // http://code.google.com/p/inferno-os/source/browse/utils/libmach/setmach.c // // Copyright © 1994-1999 Lucent Technologies Inc. // Power PC support Copyright © 1995-2004 C H Forsyth (forsyth@terzarima.net). // Portions Copyright © 1997-1999 Vita Nuova Limited. // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). // Revisions Copyright © 2000-2004 Lucent Technologies Inc. and others. // Portions Copyright © 2009 The Go Authors. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #include #include #include #include /* 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, mmips2be, mmips2le, mpower, mpower64, malpha, msparc64; extern Machdata mipsmach, sparcmach, m68020mach, i386mach, armmach, mipsmach2le, powermach, alphamach, sparc64mach; */ extern Mach mi386, mamd64, marm; extern Machdata i386mach, armmach; /* * 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[] = { { "386", /*plan 9 386*/ FI386, FI386B, AI386, &mi386, &i386mach, }, { "amd64", /*amd64*/ FAMD64, FAMD64B, AAMD64, &mamd64, &i386mach, }, { "arm", /*ARM*/ FARM, FARMB, AARM, &marm, &armmach, }, #ifdef unused { "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, }, { "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, }, { "86", /*8086 - a peach of a machine*/ FI386, FI386B, AI8086, &mi386, &i386mach, }, { "power", /*PowerPC*/ FPOWER, FPOWERB, APOWER, &mpower, &powermach, }, { "power64", /*PowerPC*/ FPOWER64, FPOWER64B, APOWER64, &mpower64, &powermach, }, { "alpha", /*Alpha*/ FALPHA, FALPHAB, AALPHA, &malpha, &alphamach, }, { "sparc64", /*plan 9 sparc64 */ FSPARC64, FSPARCB, /* XXX? */ ASPARC64, &msparc64, &sparc64mach, }, #endif { 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 = AAMD64; machdata = &i386mach; mach = &mamd64; 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; }