diff options
author | Michael Meissner <gnu@the-meissners.org> | 1995-12-15 20:20:13 +0000 |
---|---|---|
committer | Michael Meissner <gnu@the-meissners.org> | 1995-12-15 20:20:13 +0000 |
commit | 93fac32455bb5f7277b85fec5ead13f7abb9fde8 (patch) | |
tree | ed4ba905547982e681b142bc025ee5b78fe8af7f /sim/ppc/emul_bugapi.c | |
parent | ee68a042d20897e3164f96954612ccba80d70426 (diff) | |
download | gdb-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.c | 156 |
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 |