| // 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 <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, 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; | |
| } |