aboutsummaryrefslogtreecommitdiff
path: root/sim/ppc/emul_bugapi.c
diff options
context:
space:
mode:
authorMichael Meissner <gnu@the-meissners.org>1995-12-15 20:20:13 +0000
committerMichael Meissner <gnu@the-meissners.org>1995-12-15 20:20:13 +0000
commit93fac32455bb5f7277b85fec5ead13f7abb9fde8 (patch)
treeed4ba905547982e681b142bc025ee5b78fe8af7f /sim/ppc/emul_bugapi.c
parentee68a042d20897e3164f96954612ccba80d70426 (diff)
downloadgdb-93fac32455bb5f7277b85fec5ead13f7abb9fde8.zip
gdb-93fac32455bb5f7277b85fec5ead13f7abb9fde8.tar.gz
gdb-93fac32455bb5f7277b85fec5ead13f7abb9fde8.tar.bz2
Changes from Andrew
Diffstat (limited to 'sim/ppc/emul_bugapi.c')
-rw-r--r--sim/ppc/emul_bugapi.c156
1 files changed, 156 insertions, 0 deletions
diff --git a/sim/ppc/emul_bugapi.c b/sim/ppc/emul_bugapi.c
new file mode 100644
index 0000000..309869e
--- /dev/null
+++ b/sim/ppc/emul_bugapi.c
@@ -0,0 +1,156 @@
+/* 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.
+
+ */
+
+
+#ifndef _EMUL_BUGAPI_C_
+#define _EMUL_BUGAPI_C_
+
+
+/* Note: this module is called via a table. There is no benefit in
+ making it inline */
+
+#include "emul_generic.h"
+#include "emul_bugapi.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
+
+#ifndef OEA_MEMORY_SIZE
+#define OEA_MEMORY_SIZE 0x100000
+#endif
+
+static os_emul_data *
+emul_bugapi_create(device *root,
+ bfd *image,
+ const char *name)
+{
+
+ /* check it really is for us */
+ if (name != NULL
+ && strcmp(name, "bugapi") != 0)
+ return NULL;
+ if (image != NULL
+ && bfd_get_start_address(image) > OEA_START_ADDRESS)
+ return NULL;
+
+ {
+
+ const memory_size = OEA_MEMORY_SIZE;
+ const elf_binary = (image != NULL
+ && image->xvec->flavour == bfd_target_elf_flavour);
+ const little_endian = (image != NULL
+ && !image->xvec->byteorder_big_p);
+
+ { /* options */
+ device *options = device_tree_add_found(root, "/", "options");
+ device_add_integer_property(options,
+ "smp",
+ MAX_NR_PROCESSORS);
+ device_add_boolean_property(options,
+ "little-endian?",
+ little_endian);
+ device_add_string_property(options,
+ "env",
+ "operating");
+ device_add_boolean_property(options,
+ "strict-alignment?",
+ (WITH_ALIGNMENT == STRICT_ALIGNMENT
+ || !image->xvec->byteorder_big_p));
+ device_add_boolean_property(options,
+ "floating-point?",
+ WITH_FLOATING_POINT);
+ device_add_string_property(options,
+ "os-emul",
+ "bugapi");
+ }
+
+ /* hardware */
+ device_tree_add_found_uw_u_u(root, "/", "memory",
+ 0, memory_size, access_read_write_exec);
+ device_tree_add_found(root, "/", "iobus@0x400000");
+ device_tree_add_found(root, "/iobus", "console@0x000000,16");
+ device_tree_add_found(root, "/iobus", "halt@0x100000,4");
+ device_tree_add_found(root, "/iobus", "icu@0x200000,4");
+
+ { /* initialization */
+ device *init = device_tree_add_found(root, "/", "init");
+ {
+ device *init_register = device_tree_add_found(init, "", "register");
+ device_add_integer_property(init_register,
+ "pc",
+ 0);
+ device_add_integer_property(init_register,
+ "sp",
+ memory_size-16);
+ device_add_integer_property(init_register,
+ "msr",
+ (little_endian
+ ? msr_little_endian_mode
+ : 0));
+ }
+ {
+ device *init_stack = device_tree_add_found(init, "", "stack");
+ device_add_null_property(init_stack,
+ (elf_binary
+ ? "elf"
+ : "aix"));
+ }
+ {
+ device *init_load_binary = device_tree_add_found(init, "",
+ "load-binary");
+ device_add_null_property(init_load_binary,
+ bfd_get_filename(image));
+ }
+ }
+ }
+
+ return (os_emul_data*)-1;
+}
+
+static void
+emul_bugapi_init(os_emul_data *emul_data,
+ int nr_cpus)
+{
+ /* nothing happens here */
+}
+
+static int
+emul_bugapi_instruction_call(cpu *processor,
+ unsigned_word cia,
+ unsigned_word ra,
+ os_emul_data *emul_data)
+{
+ error("emul_bugapi_instruction_call() not implemented\n");
+ return 1;
+}
+
+const os_emul emul_bugapi = {
+ "bugapi",
+ emul_bugapi_create,
+ emul_bugapi_init,
+ 0, /*system_call*/
+ emul_bugapi_instruction_call,
+ 0 /*data*/
+};
+
+#endif