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  }