diff options
author | Michael Meissner <gnu@the-meissners.org> | 1995-09-21 22:23:56 +0000 |
---|---|---|
committer | Michael Meissner <gnu@the-meissners.org> | 1995-09-21 22:23:56 +0000 |
commit | 4f35cbffa65878106259680eea8134ed0acee9e7 (patch) | |
tree | 7e1a379e3a489a2ee5d75b0c583fd5fb404adf5a /sim | |
parent | 7453a7533fda60401dac9054980b2075f4af8ee4 (diff) | |
download | fsf-binutils-gdb-4f35cbffa65878106259680eea8134ed0acee9e7.zip fsf-binutils-gdb-4f35cbffa65878106259680eea8134ed0acee9e7.tar.gz fsf-binutils-gdb-4f35cbffa65878106259680eea8134ed0acee9e7.tar.bz2 |
enhance OEA behavior.
Diffstat (limited to 'sim')
-rw-r--r-- | sim/ppc/ChangeLog | 13 | ||||
-rw-r--r-- | sim/ppc/device_tree.c | 22 | ||||
-rw-r--r-- | sim/ppc/main.c | 145 |
3 files changed, 171 insertions, 9 deletions
diff --git a/sim/ppc/ChangeLog b/sim/ppc/ChangeLog index c269733..d2d2c5f 100644 --- a/sim/ppc/ChangeLog +++ b/sim/ppc/ChangeLog @@ -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. diff --git a/sim/ppc/device_tree.c b/sim/ppc/device_tree.c index 3478320..a66900d 100644 --- a/sim/ppc/device_tree.c +++ b/sim/ppc/device_tree.c @@ -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)); diff --git a/sim/ppc/main.c b/sim/ppc/main.c new file mode 100644 index 0000000..d5ad1e1 --- /dev/null +++ b/sim/ppc/main.c @@ -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; + } +} |