mirror of
https://github.com/golang/go
synced 2024-11-20 10:34:42 -07:00
fcb9387089
R=kaib DELTA=1262 (1247 added, 7 deleted, 8 changed) OCL=35907 CL=35909
204 lines
4.6 KiB
C
204 lines
4.6 KiB
C
// 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;
|
|
}
|