enhance OEA behavior.

This commit is contained in:
Michael Meissner 1995-09-21 22:23:56 +00:00
parent 7453a7533f
commit 4f35cbffa6
3 changed files with 171 additions and 9 deletions

View File

@ -1,3 +1,16 @@
Thu Sep 21 16:26:49 1995 Michael Meissner <meissner@tiktok.cygnus.com>
* std-config.h (WITH_TRACE): Default to 1 now.
* psim.c (write_stack_arguments): Don't write any stack arguments
if OEA.
* main.c (main): Switch to using getopt. Make -p also set
trace_semantics.
* device_tree.c (create_option_device_node): Assume a program is
OEA if the start address is < 4096, not just == 0.
Wed Sep 20 13:36:06 1995 Ian Lance Taylor <ian@cygnus.com>
* Makefile.in (maintainer-clean): New synonym for realclean.

View File

@ -34,6 +34,12 @@
#include "bfd.h"
/* Any starting address less than this is assumed to be an OEA program
rather than VEA. */
#ifndef OEA_START_ADDRESS
#define OEA_START_ADDRESS 4096
#endif
enum { clayton_memory_size = 0x100000 };
/* insert the address into the device_nodes sorted list of addresses */
@ -174,6 +180,8 @@ STATIC_INLINE_DEVICE_TREE device_node *
create_option_device_node(device_node *root,
bfd *image)
{
int oea = (bfd_get_start_address(image) < OEA_START_ADDRESS);
int elf = (image->xvec->flavour == bfd_target_elf_flavour);
device_node *option_node;
/* the option node and than its members */
@ -200,9 +208,9 @@ create_option_device_node(device_node *root,
"stack-pointer",
integer_type_device,
NULL,
(void*)(bfd_get_start_address(image) == 0
(void *)((oea)
? clayton_memory_size /* OEA */
: (image->xvec->flavour == bfd_target_elf_flavour
: ((elf)
? 0xe0000000 /* elf */
: 0x20000000 /* xcoff */)));
@ -211,9 +219,7 @@ create_option_device_node(device_node *root,
"vea?",
boolean_type_device,
NULL,
(void*)(bfd_get_start_address(image) == 0
? 0
: -1));
(void *)((oea) ? 0 : -1));
/* what type of binary */
TRACE(trace_tbd, ("create_optioin_device_node() - TBD - NT/OpenBoot?\n"));
@ -221,9 +227,7 @@ create_option_device_node(device_node *root,
"elf?",
boolean_type_device,
NULL,
(void*)(image->xvec->flavour == bfd_target_elf_flavour
? -1 /* elf binary */
: 0 /* probably aix binary */));
(void *)((elf) ? -1 : 0));
/* must all memory transfers be naturally aligned? */
device_node_create(option_node,
@ -232,7 +236,7 @@ create_option_device_node(device_node *root,
NULL,
(void*)((WITH_ALIGNMENT == NONSTRICT_ALIGNMENT
|| image->xvec->byteorder_big_p
|| bfd_get_start_address(image) != 0)
|| !oea)
? 0
: -1));

145
sim/ppc/main.c Normal file
View File

@ -0,0 +1,145 @@
/* This file is part of the program psim.
Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "psim.h"
extern char **environ;
extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
void
printf_filtered(char *msg, ...)
{
va_list ap;
va_start(ap, msg);
vprintf(msg, ap);
}
void
error (char *msg, ...)
{
va_list ap;
va_start(ap, msg);
vprintf(msg, ap);
exit (1);
}
void *
zalloc(long size)
{
void *memory = malloc(size);
if (memory == NULL)
error("zmalloc failed\n");
bzero(memory, size);
return memory;
}
void
zfree(void *chunk)
{
free(chunk);
}
static void
usage(void)
{
error ("Usage: psim [ -p -c -s -i -t ] <image> [ <image-args> ... ]\n");
}
int
main(int argc, char **argv)
{
psim *system;
char **argp;
const char *name_of_file;
char *arg_;
unsigned_word stack_pointer;
psim_status status;
int letter;
/* check for arguments - FIXME use getopt */
while ((letter = getopt (argc, argv, "cipst")) != EOF)
{
switch (argp[0][1]) {
case 'p':
trace[trace_cpu] = trace[trace_semantics] = 1;
break;
case 'c':
trace[trace_core] = 1;
break;
case 's':
trace[trace_create_stack] = 1;
break;
case 'i':
trace[trace_icu_device] = 1;
break;
case 't':
trace[trace_device_tree] = 1;
break;
default:
usage();
}
}
if (argp >= argv+argc)
usage();
name_of_file = *argp;
/* create the simulator */
system = psim_create(name_of_file, ((WITH_SMP > 0) ? WITH_SMP : 1));
/* fudge the environment so that _=prog-name */
arg_ = (char*)zalloc(strlen(*argp) + strlen("_=") + 1);
strcpy(arg_, "_=");
strcat(arg_, *argp);
putenv(arg_);
/* initialize it */
psim_load(system);
psim_stack(system, argp, environ);
psim_run(system);
/* why did we stop */
status = psim_get_status(system);
switch (status.reason) {
case was_continuing:
error("psim: continuing while stoped!\n");
return 0;
case was_trap:
error("psim: no trap insn\n");
return 0;
case was_exited:
return status.signal;
case was_signalled:
return status.signal;
default:
error("unknown halt condition\n");
return 0;
}
}