diff options
author | Michael Meissner <gnu@the-meissners.org> | 1996-07-23 15:42:42 +0000 |
---|---|---|
committer | Michael Meissner <gnu@the-meissners.org> | 1996-07-23 15:42:42 +0000 |
commit | 30c87b55ec44de3a56cecf41fc7c93ed0c4005ca (patch) | |
tree | 5752ad56a8e4c990eb02b12f68d486415c79c41b /sim/ppc/emul_bugapi.c | |
parent | 856bcbcbbc01a252a8df2221038100e9a33f87ff (diff) | |
download | gdb-30c87b55ec44de3a56cecf41fc7c93ed0c4005ca.zip gdb-30c87b55ec44de3a56cecf41fc7c93ed0c4005ca.tar.gz gdb-30c87b55ec44de3a56cecf41fc7c93ed0c4005ca.tar.bz2 |
New simulator changes from Andrew
Diffstat (limited to 'sim/ppc/emul_bugapi.c')
-rw-r--r-- | sim/ppc/emul_bugapi.c | 108 |
1 files changed, 89 insertions, 19 deletions
diff --git a/sim/ppc/emul_bugapi.c b/sim/ppc/emul_bugapi.c index 9a33da1..4c1e9ba 100644 --- a/sim/ppc/emul_bugapi.c +++ b/sim/ppc/emul_bugapi.c @@ -45,7 +45,7 @@ #define _READLN 0x004 /* Input line (pointer / count format) */ #define _CHKBRK 0x005 /* Check for break */ #define _DSKRD 0x010 /* Disk read */ -#define _DKSWR 0x011 /* Disk write */ +#define _DSKWR 0x011 /* Disk write */ #define _DSKCFIG 0x012 /* Disk configure */ #define _DSKFMT 0x014 /* Disk format */ #define _DSKCTRL 0x015 /* Disk control */ @@ -104,7 +104,7 @@ static const struct bug_map bug_mapping[] = { { _READLN, ".READLN -- Input line (pointer / count format)" }, { _CHKBRK, ".CHKBRK -- Check for break" }, { _DSKRD, ".DSKRD -- Disk read" }, - { _DKSWR, ".DKSWR -- Disk write" }, + { _DSKWR, ".DSKWR -- Disk write" }, { _DSKCFIG, ".DSKCFIG -- Disk configure" }, { _DSKFMT, ".DSKFMT -- Disk format" }, { _DSKCTRL, ".DSKCTRL -- Disk control" }, @@ -151,13 +151,14 @@ static const struct bug_map bug_mapping[] = { { _SYMBOLDA, ".SYMBOLDA -- Detach symbol table" }, }; -#ifndef OEA_START_ADDRESS -#define OEA_START_ADDRESS 0x100000 +#ifndef BUGAPI_END_ADDRESS +#define BUGAPI_END_ADDRESS 0x100000 #endif struct _os_emul_data { + device *root; unsigned_word memory_size; unsigned_word top_of_stack; int interrupt_prefix; @@ -169,6 +170,7 @@ struct _os_emul_data { /* I/O devices */ device_instance *output; device_instance *input; + device_instance *disk; }; @@ -188,7 +190,7 @@ emul_bugapi_create(device *root, return NULL; if (image != NULL && name == NULL - && bfd_get_start_address(image) > OEA_START_ADDRESS) + && bfd_get_start_address(image) >= BUGAPI_END_ADDRESS) return NULL; bugapi = ZALLOC(os_emul_data); @@ -203,6 +205,8 @@ emul_bugapi_create(device *root, /* add some real hardware */ emul_add_tree_hardware(root); + bugapi->root = root; + bugapi->memory_size = device_find_integer_property(root, "/openprom/options/oea-memory-size"); bugapi->interrupt_prefix = @@ -217,10 +221,8 @@ emul_bugapi_create(device *root, = device_find_boolean_property(root, "/options/little-endian?"); bugapi->floating_point_available = device_find_boolean_property(root, "/openprom/options/floating-point?"); - bugapi->input - = device_find_ihandle_property(root, "/chosen/stdin"); - bugapi->output - = device_find_ihandle_property(root, "/chosen/stdout"); + bugapi->input = NULL; + bugapi->output = NULL; /* initialization */ device_tree_add_parsed(root, "/openprom/init/register/0.pc 0x%lx", @@ -268,7 +270,7 @@ emul_bugapi_create(device *root, (unsigned long)emul_loop_instruction); device_tree_add_parsed(root, "/openprom/init/stack/stack-type %s", - elf_binary ? "elf" : "aix"); + elf_binary ? "ppc-elf" : "ppc-xcoff"); device_tree_add_parsed(root, "/openprom/init/load-binary/file-name \"%s", bfd_get_filename(image)); @@ -277,10 +279,14 @@ emul_bugapi_create(device *root, } static void -emul_bugapi_init(os_emul_data *emul_data, +emul_bugapi_init(os_emul_data *bugapi, int nr_cpus) { - /* nothing happens here */ + /* get the current input/output devices that were created during + device tree initialization */ + bugapi->input = device_find_ihandle_property(bugapi->root, "/chosen/stdin"); + bugapi->output = device_find_ihandle_property(bugapi->root, "/chosen/stdout"); + bugapi->disk = device_find_ihandle_property(bugapi->root, "/chosen/disk"); } static const char * @@ -337,6 +343,61 @@ emul_bugapi_do_read(os_emul_data *bugapi, } static void +emul_bugapi_do_diskio(os_emul_data *bugapi, + cpu *processor, + unsigned_word cia, + unsigned_word descriptor_addr, + int call_id) +{ + struct dskio_descriptor { + unsigned_1 ctrl_lun; + unsigned_1 dev_lun; + unsigned_2 status; + unsigned_word pbuffer; + unsigned_4 blk_num; + unsigned_2 blk_cnt; + unsigned_1 flag; +#define BUG_FILE_MARK 0x80 +#define IGNORE_FILENUM 0x02 +#define END_OF_FILE 0x01 + unsigned_1 addr_mod; + } descriptor; + int block; + emul_read_buffer(&descriptor, descriptor_addr, sizeof(descriptor), + processor, cia); + T2H(descriptor.ctrl_lun); + T2H(descriptor.dev_lun); + T2H(descriptor.status); + T2H(descriptor.pbuffer); + T2H(descriptor.blk_num); + T2H(descriptor.blk_cnt); + T2H(descriptor.flag); + T2H(descriptor.addr_mod); + for (block = 0; block < descriptor.blk_cnt; block++) { + unsigned_1 buf[512]; /*????*/ + unsigned_word block_nr = descriptor.blk_num + block; + unsigned_word byte_nr = block_nr * sizeof(buf); + unsigned_word block_addr = descriptor.pbuffer + block*sizeof(buf); + if (device_instance_seek(bugapi->disk, 0, byte_nr) < 0) + error("emul_bugapi_do_diskio: bad seek\n"); + switch (call_id) { + case _DSKRD: + if (device_instance_read(bugapi->disk, buf, sizeof(buf)) != sizeof(buf)) + error("emul_bugapi_do_diskio: bad read\n"); + emul_write_buffer(buf, block_addr, sizeof(buf), processor, cia); + break; + case _DSKWR: + emul_read_buffer(buf, block_addr, sizeof(buf), processor, cia); + if (device_instance_write(bugapi->disk, buf, sizeof(buf)) != sizeof(buf)) + error("emul_bugapi_do_diskio: bad write\n"); + break; + default: + error("emul_bugapi_do_diskio: bad switch\n"); + } + } +} + +static void emul_bugapi_do_write(os_emul_data *bugapi, cpu *processor, unsigned_word cia, @@ -382,13 +443,14 @@ emul_bugapi_instruction_call(cpu *processor, os_emul_data *bugapi) { const int call_id = cpu_registers(processor)->gpr[10]; - const char *my_prefix UNUSED = "bugapi"; unsigned char uc; - ITRACE (trace_os_emul,(" 0x%x %s, r3 = 0x%lx, r4 = 0x%lx\n", - call_id, emul_bugapi_instruction_name (call_id), - (long)cpu_registers(processor)->gpr[3], - (long)cpu_registers(processor)->gpr[4]));; +#define MY_INDEX itable_instruction_call + ITRACE (trace_os_emul, + (" 0x%x %s, r3 = 0x%lx, r4 = 0x%lx\n", + call_id, emul_bugapi_instruction_name (call_id), + (long)cpu_registers(processor)->gpr[3], + (long)cpu_registers(processor)->gpr[4]));; /* check that this isn't an invalid instruction */ if (cia != bugapi->system_call_address) @@ -440,9 +502,17 @@ emul_bugapi_instruction_call(cpu *processor, case _PCRLF: device_instance_write(bugapi->output, "\n", 1); break; - /* return to ppcbug monitor */ + /* read/write blocks of data to/from the disk */ + case _DSKWR: + case _DSKRD: + emul_bugapi_do_diskio(bugapi, processor, cia, + cpu_registers(processor)->gpr[3], + call_id); + break; + /* return to ppcbug monitor (exiting with gpr[3] as status is not + part of the bug monitor) */ case _RETURN: - cpu_halt(processor, cia, was_exited, 0); /* always succeeds */ + cpu_halt(processor, cia, was_exited, cpu_registers(processor)->gpr[3]); break; } return 1; |