From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 92313 invoked by alias); 24 Nov 2016 14:59:57 -0000 Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org Received: (qmail 92246 invoked by uid 89); 24 Nov 2016 14:59:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=BAYES_50,RP_MATCHES_RCVD,SPF_HELO_PASS,T_FILL_THIS_FORM_SHORT autolearn=ham version=3.3.2 spammy=dar, cells, 7.12, 928 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 24 Nov 2016 14:59:50 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A9FF643A2C; Thu, 24 Nov 2016 14:59:49 +0000 (UTC) Received: from [127.0.0.1] (ovpn03.gateway.prod.ext.phx2.redhat.com [10.5.9.3]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id uAOExlul010412; Thu, 24 Nov 2016 09:59:48 -0500 Subject: Re: gdb-7.12 powerpc-rtems4.12-gdb does not build on FreeBSD. To: John Baldwin References: <5834D6E0.9060601@rtems.org> <2608815.dbYXHQl3xm@ralph.baldwin.cx> <1ea845b2-d6bc-e9f7-d649-bc4f37462d92@redhat.com> <2179193.1CJTdt5csh@ralph.baldwin.cx> Cc: Chris Johns , gdb@sourceware.org From: Pedro Alves Message-ID: <3e3f8637-bd0c-4849-0430-1922a737f8f7@redhat.com> Date: Thu, 24 Nov 2016 14:59:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <2179193.1CJTdt5csh@ralph.baldwin.cx> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-SW-Source: 2016-11/txt/msg00049.txt.bz2 On 11/24/2016 02:18 PM, John Baldwin wrote: > On Thursday, November 24, 2016 12:12:45 PM Pedro Alves wrote: >> The PPC sim shouldn't be calling GDB's "error" directly. If it does, >> then that's should be fixed. There's an "error" method in the >> host_callback structure (filled in by GDB) that should be used instead. > > Ah, the sim defines its own 'error()' routine in misc.c. It also defines its > own zalloc() and a few other routines, but misc.o isn't included in libsim.a, > only for specific binaries (it seems to be a stub defined to hold routines > normally defined in gdb for use in stand-alone programs). Curiously, sim_calls.c > defines its own zalloc(). I tried adding an error() to sim_calls.c and that > fixes the build. I modeled it on sim_io_error(): Ah, yes, that's indeed simpler than what I was going for (see below, incomplete). Yours should be able to go to both 7.12 and master. Please send it to gdb-patches. This exposes something else that needs to be done, as long as the sim is C -- gdb/remote-sim.c:gdb_os_error (which is what host_callback->error is set to, throws a C++ exception, and that will want to cross the sim. But that will only work if the sim is build with -fexceptions (which is the default on x86_64). So we either need to always build the sim explicitly with -fexceptions, or we need to longjmp out of the sim instead of throwing a C++ exception. E.g., wrap calls into the sim with TRY_SJLJ/CATCH_SJLJ and make gdb_os_error use throw_exception_sjlj, like we handle longjmp-ing across readline. >From a9311bc383f45829ec695a55bbbb301deeafff8d Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 24 Nov 2016 12:25:50 +0000 Subject: [PATCH] psim and error --- sim/ppc/cap.c | 8 ++++---- sim/ppc/corefile.c | 9 ++++----- sim/ppc/cpu.c | 4 ++-- sim/ppc/debug.c | 2 +- sim/ppc/debug.h | 4 ++-- sim/ppc/device.c | 20 ++++++++++---------- sim/ppc/device_table.c | 2 +- sim/ppc/dgen.c | 2 +- sim/ppc/emul_bugapi.c | 16 ++++++++-------- sim/ppc/emul_chirp.c | 43 ++++++++++++++++++++++-------------------- sim/ppc/emul_generic.c | 11 ++++++----- sim/ppc/emul_netbsd.c | 10 +++++----- sim/ppc/events.c | 2 +- sim/ppc/gen-icache.c | 2 +- sim/ppc/gen-idecode.c | 4 ++-- sim/ppc/gen-model.c | 6 ++++-- sim/ppc/gen-support.c | 2 +- sim/ppc/hw_core.c | 2 +- sim/ppc/hw_cpu.c | 7 +++---- sim/ppc/hw_init.c | 2 +- sim/ppc/hw_nvram.c | 2 +- sim/ppc/hw_phb.c | 4 ++-- sim/ppc/hw_register.c | 2 +- sim/ppc/hw_sem.c | 31 +++++++++++++++--------------- sim/ppc/hw_shm.c | 12 ++++++------ sim/ppc/igen.c | 4 ++-- sim/ppc/interrupts.c | 38 ++++++++++++++----------------------- sim/ppc/ld-cache.c | 2 +- sim/ppc/ld-decode.c | 2 +- sim/ppc/ld-insn.c | 23 ++++++++++++----------- sim/ppc/lf.c | 2 +- sim/ppc/main.c | 49 +++++++++++++++++++++++++++++++----------------- sim/ppc/misc.c | 8 ++++---- sim/ppc/misc.h | 22 +++++++++++----------- sim/ppc/mon.c | 2 +- sim/ppc/os_emul.c | 4 ++-- sim/ppc/ppc-instructions | 10 +++++----- sim/ppc/psim.c | 5 +++-- sim/ppc/sim_callbacks.h | 15 +++++++++++++-- sim/ppc/sim_calls.c | 36 +++++++++++++++++++++-------------- sim/ppc/table.c | 2 +- sim/ppc/tree.c | 6 +++--- sim/ppc/vm.c | 8 ++++---- sim/ppc/vm_n.h | 4 ++-- 44 files changed, 240 insertions(+), 211 deletions(-) diff --git a/sim/ppc/cap.c b/sim/ppc/cap.c index 48ac5bc..f20f92b 100644 --- a/sim/ppc/cap.c +++ b/sim/ppc/cap.c @@ -53,12 +53,12 @@ cap_init(cap *db) down to nr 1 */ while (current_map->next != NULL) { if (current_map->external != current_map->next->external + 1) - error("cap: cap database possibly corrupt"); + sim_io_error ("cap: cap database possibly corrupt"); current_map = current_map->next; } ASSERT(current_map->next == NULL); if (current_map->external != 1) - error("cap: cap database possibly currupt"); + sim_io_error ("cap: cap database possibly currupt"); } else { db->nr_mappings = 0; @@ -99,7 +99,7 @@ cap_add(cap *db, void *internal) { if (cap_external(db, internal) != 0) { - error("cap: attempting to add an object already in the data base"); + sim_io_error ("cap: attempting to add an object already in the data base"); } else { /* insert at the front making things in decending order */ @@ -127,7 +127,7 @@ cap_remove(cap *db, } current_map = &(*current_map)->next; } - error("cap: attempt to remove nonexistant internal object"); + sim_io_error ("cap: attempt to remove nonexistant internal object"); } #endif diff --git a/sim/ppc/corefile.c b/sim/ppc/corefile.c index d784d64..211ef80 100644 --- a/sim/ppc/corefile.c +++ b/sim/ppc/corefile.c @@ -153,8 +153,8 @@ new_core_mapping(attach_type attach, new_mapping->device = device; } else { - error("new_core_mapping() - internal error - unknown attach type %d\n", - attach); + sim_io_internal_error("unknown attach type %d", + attach); } return new_mapping; } @@ -263,8 +263,7 @@ core_attach(core *memory, free_buffer = NULL; break; default: - error("core_attach() internal error\n"); - break; + sim_io_internal_error ("bad switch"); } } /* allocated buffer must attach to at least one thing */ @@ -291,7 +290,7 @@ core_map_find_mapping(core_map *map, mapping = mapping->next; } if (abort) - error("core_find_mapping() - access to unmaped address, attach a default map to handle this - addr=0x%x nr_bytes=0x%x processor=0x%x cia=0x%x\n", + sim_io_internal_error ("access to unmaped address, attach a default map to handle this - addr=0x%x nr_bytes=0x%x processor=0x%x cia=0x%x", addr, nr_bytes, processor, cia); return NULL; } diff --git a/sim/ppc/cpu.c b/sim/ppc/cpu.c index c7e8bdf..a119f2c 100644 --- a/sim/ppc/cpu.c +++ b/sim/ppc/cpu.c @@ -216,7 +216,7 @@ cpu_error(cpu *processor, /* sanity check */ if (strlen(message) >= sizeof(message)) - error("cpu_error: buffer overflow"); + sim_io_internal_error ("buffer overflow"); if (processor != NULL) { printf_filtered("cpu %d, cia 0x%lx: %s\n", @@ -224,7 +224,7 @@ cpu_error(cpu *processor, cpu_halt(processor, cia, was_signalled, -1); } else { - error("cpu: %s", message); + sim_io_internal_error ("cpu: %s", message); } } diff --git a/sim/ppc/debug.c b/sim/ppc/debug.c index 1ec279b..a9e9569 100644 --- a/sim/ppc/debug.c +++ b/sim/ppc/debug.c @@ -111,7 +111,7 @@ trace_option(const char *option, if (i > 0 && i < nr_trace_options) ppc_trace[i] = setting; else - error("Unknown trace option: %s\n", option); + psim_fatal_error ("Unknown trace option: %s\n", option); } } diff --git a/sim/ppc/debug.h b/sim/ppc/debug.h index 6f19624..92e283a 100644 --- a/sim/ppc/debug.h +++ b/sim/ppc/debug.h @@ -155,8 +155,8 @@ do { \ do { \ if (WITH_ASSERT) { \ if (!(EXPRESSION)) { \ - error("%s:%d: assertion failed - %s\n", \ - filter_filename(__FILE__), __LINE__, #EXPRESSION); \ + sim_io_error("%s:%d: assertion failed - %s\n", \ + filter_filename(__FILE__), __LINE__, #EXPRESSION); \ } \ } \ } while (0) diff --git a/sim/ppc/device.c b/sim/ppc/device.c index d5093bb..89a7af4 100644 --- a/sim/ppc/device.c +++ b/sim/ppc/device.c @@ -199,7 +199,7 @@ device_full_name(device *leaf, /* construct a name */ if (leaf->parent == NULL) { if (sizeof_buf < 1) - error("device_full_name: buffer overflow"); + sim_io_internal_error ("device_full_name: buffer overflow"); *buf = '\0'; } else { @@ -215,7 +215,7 @@ device_full_name(device *leaf, unit[0] = '\0'; if (strlen(buf) + strlen("/") + strlen(leaf->name) + strlen(unit) >= sizeof_buf) - error("device_full_name: buffer overflow"); + sim_io_internal_error ("buffer overflow"); strcat(buf, "/"); strcat(buf, leaf->name); strcat (buf, unit); @@ -1766,14 +1766,14 @@ device_interrupt_encode(device *me, strcpy(buf, ports->name); sprintf(buf + strlen(buf), "%d", port_number - ports->number); if (strlen(buf) >= sizeof_buf) - error("device_interrupt_encode: buffer overflow"); + sim_io_internal_error ("buffer overflow"); return strlen(buf); } } else { if (ports->number == port_number) { if (strlen(ports->name) >= sizeof_buf) - error("device_interrupt_encode: buffer overflow"); + sim_io_internal_error ("buffer overflow"); strcpy(buf, ports->name); return strlen(buf); } @@ -1784,7 +1784,7 @@ device_interrupt_encode(device *me, } sprintf(buf, "%d", port_number); if (strlen(buf) >= sizeof_buf) - error("device_interrupt_encode: buffer overflow"); + sim_io_internal_error ("buffer overflow"); return strlen(buf); } @@ -1828,15 +1828,15 @@ device_error(device *me, va_end(ap); /* sanity check */ if (strlen(message) >= sizeof(message)) - error("device_error: buffer overflow"); + sim_io_internal_error ("buffer overflow"); if (me == NULL) - error("device: %s", message); + sim_io_internal_error ("device: %s", message); else if (me->path != NULL && me->path[0] != '\0') - error("%s: %s", me->path, message); + sim_io_internal_error ("%s: %s", me->path, message); else if (me->name != NULL && me->name[0] != '\0') - error("%s: %s", me->name, message); + sim_io_internal_error ("%s: %s", me->name, message); else - error("device: %s", message); + sim_io_internal_error ("device: %s", message); while(1); } diff --git a/sim/ppc/device_table.c b/sim/ppc/device_table.c index d2c6195..c10b93d 100644 --- a/sim/ppc/device_table.c +++ b/sim/ppc/device_table.c @@ -169,7 +169,7 @@ generic_device_unit_encode(device *bus, len = pos - buf; } if (len >= sizeof_buf) - error("generic_unit_encode - buffer overflow\n"); + sim_io_internal_error ("buffer overflow"); return len; } diff --git a/sim/ppc/dgen.c b/sim/ppc/dgen.c index 8e8f5fb..19b97b0 100644 --- a/sim/ppc/dgen.c +++ b/sim/ppc/dgen.c @@ -328,7 +328,7 @@ main(int argc, real_file_name = NULL; break; default: - error("unknown option\n"); + psim_fatal_error ("unknown option\n"); } } return 0; diff --git a/sim/ppc/emul_bugapi.c b/sim/ppc/emul_bugapi.c index e33d0cf..856e890 100644 --- a/sim/ppc/emul_bugapi.c +++ b/sim/ppc/emul_bugapi.c @@ -419,8 +419,8 @@ emul_bugapi_do_diskio(os_emul_data *bugapi, T2H(descriptor.addr_mod); if (descriptor.dev_lun >= nr_bugapi_disks || bugapi->disk[descriptor.dev_lun] == NULL) { - error("emul_bugapi_do_diskio: attempt to access unconfigured disk /chosen/disk%d", - descriptor.dev_lun); + sim_io_internal_error ("attempt to access unconfigured disk /chosen/disk%d", + descriptor.dev_lun); } else { for (block = 0; block < descriptor.blk_cnt; block++) { @@ -430,20 +430,20 @@ emul_bugapi_do_diskio(os_emul_data *bugapi, unsigned_word byte_nr = block_nr * sizeof(buf); unsigned_word block_addr = descriptor.pbuffer + block*sizeof(buf); if (device_instance_seek(disk, 0, byte_nr) < 0) - error("emul_bugapi_do_diskio: bad seek\n"); + sim_io_internal_error ("bad seek"); switch (call_id) { case _DSKRD: if (device_instance_read(disk, buf, sizeof(buf)) != sizeof(buf)) - error("emul_`bugapi_do_diskio: bad read\n"); + sim_io_internal_error ("bad read"); 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(disk, buf, sizeof(buf)) != sizeof(buf)) - error("emul_bugapi_do_diskio: bad write\n"); + sim_io_internal_error ("bad write"); break; default: - error("emul_bugapi_do_diskio: bad switch\n"); + sim_io_internal_error ("bad switch"); } } } @@ -502,8 +502,8 @@ emul_bugapi_instruction_call(cpu *processor, switch (call_id) { default: - error("emul-bugapi: unimplemented bugapi %s from address 0x%lx\n", - emul_bugapi_instruction_name (call_id), SRR0); + sim_io_internal_error ("unimplemented bugapi %s from address 0x%lx", + emul_bugapi_instruction_name (call_id), SRR0); break; /* read a single character, output r3 = byte */ diff --git a/sim/ppc/emul_chirp.c b/sim/ppc/emul_chirp.c index f326410..c8549dc 100644 --- a/sim/ppc/emul_chirp.c +++ b/sim/ppc/emul_chirp.c @@ -889,7 +889,7 @@ chirp_emul_call_method(os_emul_data *data, /* see if we can emulate this method */ if (ihandle == NULL) { /* OpenFirmware doesn't define this error */ - error("chirp: invalid ihandle passed to call-method method"); + sim_io_internal_error ("invalid ihandle passed to call-method method"); } else { args.stack[stack_catch_result] = @@ -975,7 +975,7 @@ chirp_emul_close(os_emul_data *data, /* close the device */ if (ihandle == NULL) { /* OpenFirmware doesn't define this error */ - error("chirp: invalid ihandle passed to close method"); + sim_io_internal_error ("chirp: invalid ihandle passed to close method"); } else { device_instance_delete(ihandle); @@ -1016,7 +1016,7 @@ chirp_emul_read(os_emul_data *data, (unsigned long)args.len)); if (ihandle == NULL) { /* OpenFirmware doesn't define this error */ - error("chirp: invalid ihandle passed to read method"); + sim_io_internal_error ("chirp: invalid ihandle passed to read method"); } else { /* do the reads */ @@ -1055,7 +1055,7 @@ chirp_emul_read(os_emul_data *data, args.actual = sim_io_not_ready; break; default: - error("Bad error value %ld", (long)actual); + sim_io_internal_error ("Bad error value %ld", (long)actual); break; } } @@ -1107,7 +1107,7 @@ chirp_emul_write(os_emul_data *data, buf, (long)actual)); if (ihandle == NULL) { /* OpenFirmware doesn't define this error */ - error("chirp: invalid ihandle passed to write method"); + sim_io_internal_error ("chirp: invalid ihandle passed to write method"); } else { /* write it out */ @@ -1153,7 +1153,7 @@ chirp_emul_seek(os_emul_data *data, args.pos_hi, args.pos_lo)); if (ihandle == NULL) { /* OpenFirmware doesn't define this error */ - error("chirp: invalid ihandle passed to seek method"); + sim_io_internal_error ("chirp: invalid ihandle passed to seek method"); } else { /* seek it out */ @@ -1210,15 +1210,16 @@ chirp_emul_claim(os_emul_data *data, mem_in[2] = args.virt; if (device_instance_call_method(memory, "claim", 3, mem_in, 1, mem_out) < 0) - error("chirp: claim failed to allocate memory virt=0x%lx size=%ld align=%d", - (unsigned long)args.virt, - (long int)args.size, - (int)args.align); + sim_io_internal_error ("chirp: claim failed to allocate memory " + "virt=0x%lx size=%ld align=%d", + (unsigned long)args.virt, + (long int)args.size, + (int)args.align); args.baseaddr = mem_out[0]; } /* if using virtual addresses, create a 1-1 map of this address space */ if (!data->real_mode) { - error("chirp: claim method does not support virtual mode"); + sim_io_internal_error ("chirp: claim method does not support virtual mode"); } /* return the base address */ TRACE(trace_os_emul, ("claim - out - baseaddr=0x%lx\n", @@ -1262,13 +1263,15 @@ chirp_emul_release(os_emul_data *data, mem_in[1] = args.virt; if (device_instance_call_method(memory, "release", 2, mem_in, 0, NULL) < 0) - error("chirp: claim failed to release memory virt=0x%lx size=%ld", - (unsigned long)args.virt, - (long int)args.size); + sim_io_internal_error ("chirp: claim failed to release memory " + "virt=0x%lx size=%ld", + (unsigned long)args.virt, + (long int)args.size); } /* if using virtual addresses, remove the 1-1 map of this address space */ if (!data->real_mode) { - error("chirp: release method does not support virtual mode"); + sim_io_internal_error ("chirp: release method does not " + "support virtual mode"); } /* return the base address */ TRACE(trace_os_emul, ("release - out\n")); @@ -1314,7 +1317,7 @@ chirp_emul_enter(os_emul_data *data, cpu *processor, unsigned_word cia) { - error("chirp: enter method not implemented\n"); + sim_io_internal_error ("chirp: enter method not implemented\n"); return 0; } @@ -1340,7 +1343,7 @@ chirp_emul_chain(os_emul_data *data, cpu *processor, unsigned_word cia) { - error("chirp: chain method not implemented\n"); + sim_io_internal_error ("chirp: chain method not implemented"); return 0; } @@ -1352,7 +1355,7 @@ chirp_emul_interpret(os_emul_data *data, cpu *processor, unsigned_word cia) { - error("chirp: interpret method not implemented\n"); + sim_io_internal_error ("chirp: interpret method not implemented"); return 0; } @@ -1361,7 +1364,7 @@ chirp_emul_set_callback(os_emul_data *data, cpu *processor, unsigned_word cia) { - error("chirp: set_callback method not implemented\n"); + sim_io_internal_error ("chirp: set_callback method not implemented"); return 0; } @@ -1370,7 +1373,7 @@ chirp_emul_set_symbol_lookup(os_emul_data *data, cpu *processor, unsigned_word cia) { - error("chirp: set_symbol_lookup method not implemented\n"); + sim_io_internal_error ("chirp: set_symbol_lookup method not implemented"); return 0; } diff --git a/sim/ppc/emul_generic.c b/sim/ppc/emul_generic.c index dc0b2cf..3935113 100644 --- a/sim/ppc/emul_generic.c +++ b/sim/ppc/emul_generic.c @@ -218,14 +218,15 @@ emul_do_system_call(os_emul_data *emul_data, { emul_syscall_handler *handler = NULL; if (call >= emul->nr_system_calls) - error("do_call() os_emul call %d out-of-range\n", call); + sim_io_internal_error ("os_emul call %d out-of-range", call); handler = emul->syscall_descriptor[call].handler; if (handler == NULL) { if (emul->syscall_descriptor[call].name) { - error("do_call() unimplemented call %s\n", emul->syscall_descriptor[call].name); + sim_io_internal_error ("unimplemented call %s", + emul->syscall_descriptor[call].name); } else { - error("do_call() unimplemented call %d\n", call); + sim_io_internal_error ("unimplemented call %d", call); } } @@ -305,8 +306,8 @@ emul_add_tree_hardware(device *root) /* sanity check the number of processors */ if (nr_cpus > MAX_NR_PROCESSORS) - error("Specified number of processors (%d) exceeds the number configured (%d).\n", - nr_cpus, MAX_NR_PROCESSORS); + sim_io_error ("Specified number of processors (%d) exceeds the number configured (%d).", + nr_cpus, MAX_NR_PROCESSORS); /* set the number of address cells (1 or 2) */ tree_parse(root, "#address-cells %d", WITH_TARGET_WORD_BITSIZE / 32); diff --git a/sim/ppc/emul_netbsd.c b/sim/ppc/emul_netbsd.c index 12dfb21..f3b702a 100644 --- a/sim/ppc/emul_netbsd.c +++ b/sim/ppc/emul_netbsd.c @@ -1032,7 +1032,7 @@ do___sysctl(os_emul_data *emul, /* pluck out the management information base id */ if (namelen < 1) - error("system_call()SYS___sysctl bad name[0]\n"); + sim_io_error ("system_call()SYS___sysctl bad name[0]"); mib = vm_data_map_read_word(cpu_data_map(processor), name, processor, @@ -1046,7 +1046,7 @@ do___sysctl(os_emul_data *emul, # error "CTL_HW" #endif if (namelen < 2) - error("system_call()SYS___sysctl - CTL_HW - bad name[1]\n"); + sim_io_error ("system_call()SYS___sysctl - CTL_HW - bad name[1]\n"); mib = vm_data_map_read_word(cpu_data_map(processor), name, processor, @@ -1062,19 +1062,19 @@ do___sysctl(os_emul_data *emul, processor, cia); if (sizeof(natural_word) > oldlen) - error("system_call()sysctl - CTL_HW.HW_PAGESIZE - to small\n"); + sim_io_error ("system_call()sysctl - CTL_HW.HW_PAGESIZE - to small\n"); int_val = 8192; oldlen = sizeof(int_val); emul_write_word(oldp, int_val, processor, cia); emul_write_word(oldlenp, oldlen, processor, cia); break; default: - error("sysctl() CTL_HW.%d unknown\n", mib); + sim_io_error ("sysctl() CTL_HW.%d unknown\n", mib); break; } break; default: - error("sysctl() name[0]=%d unknown\n", (int)mib); + sim_io_error ("sysctl() name[0]=%d unknown\n", (int)mib); break; } emul_write_status(processor, 0, 0); /* always succeed */ diff --git a/sim/ppc/events.c b/sim/ppc/events.c index 130b28b..f363601 100644 --- a/sim/ppc/events.c +++ b/sim/ppc/events.c @@ -193,7 +193,7 @@ insert_event_entry(event_queue *events, signed64 time_of_event; if (delta < 0) - error("what is past is past!\n"); + sim_io_internal_error ("what is past is past!\n"); /* compute when the event should occure */ time_of_event = event_queue_time(events) + delta; diff --git a/sim/ppc/gen-icache.c b/sim/ppc/gen-icache.c index 8acf3fb..1df67b0 100644 --- a/sim/ppc/gen-icache.c +++ b/sim/ppc/gen-icache.c @@ -655,7 +655,7 @@ print_icache_internal_function_definition(insn_table *table, table_entry_print_cpp_line_nr(file, function); if ((code & generate_with_semantic_icache)) { lf_print__c_code(file, function->annex); - lf_printf(file, "error(\"Internal function must longjump\\n\");\n"); + lf_printf(file, "sim_io_internal_error(\"Internal function must longjump\\n\");\n"); lf_printf(file, "return 0;\n"); } else { diff --git a/sim/ppc/gen-idecode.c b/sim/ppc/gen-idecode.c index 256ba75..deda162 100644 --- a/sim/ppc/gen-idecode.c +++ b/sim/ppc/gen-idecode.c @@ -479,7 +479,7 @@ idecode_switch_end(insn_table *table, print_idecode_switch_illegal(file, result); break; case padded_switch_gen: - lf_printf(file, " error(\"Internal error - bad switch generated\\n\");\n"); + lf_printf(file, " sim_io_internal_error(\"bad switch generated\");\n"); lf_printf(file, " break;\n"); break; default: @@ -1543,6 +1543,6 @@ gen_idecode_c(lf *file, } else { - error("Something is wrong!\n"); + psim_fatal_error ("Something is wrong!\n"); } } diff --git a/sim/ppc/gen-model.c b/sim/ppc/gen-model.c index 00f2b02..8871012 100644 --- a/sim/ppc/gen-model.c +++ b/sim/ppc/gen-model.c @@ -56,7 +56,8 @@ model_c_or_h_function(insn_table *entry, { if (function->fields[function_type] == NULL || function->fields[function_type][0] == '\0') { - error("Model function type not specified for %s", function->fields[function_name]); + psim_fatal_error ("Model function type not specified for %s", + function->fields[function_name]); } lf_printf(file, "\n"); lf_print_function_type(file, function->fields[function_type], prefix, " "); @@ -207,7 +208,8 @@ model_c_function(insn_table *table, { if (function->fields[function_type] == NULL || function->fields[function_type][0] == '\0') { - error("Model function return type not specified for %s", function->fields[function_name]); + psim_fatal_error ("Model function return type not specified for %s", + function->fields[function_name]); } else { lf_printf(file, "\n"); diff --git a/sim/ppc/gen-support.c b/sim/ppc/gen-support.c index 85ab497..25b1529 100644 --- a/sim/ppc/gen-support.c +++ b/sim/ppc/gen-support.c @@ -105,7 +105,7 @@ support_c_function(insn_table *table, lf_indent(file, +2); lf_print__c_code(file, function->annex); if (it_is("internal", function->fields[insn_flags])) { - lf_printf(file, "error(\"Internal function must longjump\\n\");\n"); + lf_printf(file, "sim_io_internal_error(\"Internal function must longjump\");\n"); lf_printf(file, "return 0;\n"); } lf_indent(file, -2); diff --git a/sim/ppc/hw_core.c b/sim/ppc/hw_core.c index 0aa0fdd..fe97fce 100644 --- a/sim/ppc/hw_core.c +++ b/sim/ppc/hw_core.c @@ -67,7 +67,7 @@ hw_core_attach_address_callback(device *me, { core *memory = (core*)device_data(me); if (space != 0) - error("core_attach_address_callback() invalid address space\n"); + sim_io_internal_error ("invalid address space"); core_attach(memory, attach, space, diff --git a/sim/ppc/hw_cpu.c b/sim/ppc/hw_cpu.c index df807c1..27f21f9 100644 --- a/sim/ppc/hw_cpu.c +++ b/sim/ppc/hw_cpu.c @@ -131,8 +131,7 @@ hw_cpu_interrupt_event(device *me, { hw_cpu_device *hw_cpu = (hw_cpu_device*)device_data(me); if (my_port < 0 || my_port >= hw_cpu_nr_interrupt_ports) - error("hw_cpu_interrupt_event_callback: interrupt port out of range %d\n", - my_port); + sim_io_internal_error ("interrupt port out of range %d", my_port); switch (my_port) { /*case hw_cpu_hard_reset:*/ /*case hw_cpu_soft_reset:*/ @@ -141,8 +140,8 @@ hw_cpu_interrupt_event(device *me, break; /*case hw_cpu_machine_check_interrupt:*/ default: - error("hw_cpu_deliver_interrupt: unimplemented interrupt port %d\n", - my_port); + sim_io_internal_error ("unimplemented interrupt port %d", + my_port); break; } } diff --git a/sim/ppc/hw_init.c b/sim/ppc/hw_init.c index 0e7403b..896b038 100644 --- a/sim/ppc/hw_init.c +++ b/sim/ppc/hw_init.c @@ -350,7 +350,7 @@ update_for_binary_section(bfd *abfd, /* If there is an .interp section, it means it needs a shared library interpreter. */ if (strcmp(".interp", bfd_get_section_name(abfd, the_section)) == 0) - error("Shared libraries are not yet supported.\n"); + sim_io_internal_error ("Shared libraries are not yet supported.\n"); /* determine the devices access */ access = access_read; diff --git a/sim/ppc/hw_nvram.c b/sim/ppc/hw_nvram.c index f8caaa8..bf89556 100644 --- a/sim/ppc/hw_nvram.c +++ b/sim/ppc/hw_nvram.c @@ -201,7 +201,7 @@ hw_nvram_update_clock(hw_nvram_device *nvram, static void hw_nvram_set_clock(hw_nvram_device *nvram, cpu *processor) { - error ("fixme - how do I set the localtime\n"); + psim_fatal_error ("fixme - how do I set the localtime\n"); } static unsigned diff --git a/sim/ppc/hw_phb.c b/sim/ppc/hw_phb.c index 8e3fb17..8425637 100644 --- a/sim/ppc/hw_phb.c +++ b/sim/ppc/hw_phb.c @@ -791,7 +791,7 @@ hw_phb_unit_encode(device *me, (unsigned long)unit_address->cells[2]); } if (strlen(buf) > sizeof_buf) - error("buffer overflow"); + sim_io_internal_error ("buffer overflow"); return strlen(buf); } @@ -1049,7 +1049,7 @@ hw_phb_create(const char *name, pci_space->name = "special"; break; default: - error ("internal error"); + sim_io_internal_error ("internal error"); break; } } diff --git a/sim/ppc/hw_register.c b/sim/ppc/hw_register.c index de65c9f..3bc29a6 100644 --- a/sim/ppc/hw_register.c +++ b/sim/ppc/hw_register.c @@ -101,7 +101,7 @@ do_register_init(device *me, &value, name, cooked_transfer) <= 0) - error("Invalid register name %s\n", name); + psim_fatal_error ("Invalid register name %s\n", name); } } diff --git a/sim/ppc/hw_sem.c b/sim/ppc/hw_sem.c index f1c3295..585acb6 100644 --- a/sim/ppc/hw_sem.c +++ b/sim/ppc/hw_sem.c @@ -121,10 +121,10 @@ hw_sem_init_data(device *me) /* initialize the properties of the sem */ if (device_find_property(me, "key") == NULL) - error("sem_init_data() required key property is missing\n"); + sim_io_internal_error ("required key property is missing"); if (device_find_property(me, "value") == NULL) - error("sem_init_data() required value property is missing\n"); + sim_io_internal_error ("required value property is missing"); sem->key = (key_t) device_find_integer_property(me, "key"); DTRACE(sem, ("semaphore key (%d)\n", sem->key) ); @@ -142,22 +142,22 @@ hw_sem_init_data(device *me) sem->id = semget(sem->key, 1, IPC_CREAT | 0660); if (sem->id == -1) - error("hw_sem_init_data() semget failed\n"); + sim_io_internal_error ("semget failed\n"); help.val = sem->initial; status = semctl( sem->id, 0, SETVAL, help ); if (status == -1) - error("hw_sem_init_data() semctl -- set value failed\n"); + sim_io_internal_error ("semctl -- set value failed"); } else { sem->id = semget(sem->key, 1, 0660); if (sem->id == -1) - error("hw_sem_init_data() semget failed\n"); + sim_io_internal_error ("semget failed"); } sem->count = semctl( sem->id, 0, GETVAL, help ); if (sem->count == -1) - error("hw_sem_init_data() semctl -- get value failed\n"); + sim_io_internal_error ("semctl -- get value failed\n"); DTRACE(sem, ("semaphore OS value (%d)\n", sem->count) ); } @@ -173,10 +173,10 @@ hw_sem_attach_address_callback(device *me, hw_sem_device *sem = (hw_sem_device*)device_data(me); if (space != 0) - error("sem_attach_address_callback() invalid address space\n"); + sim_io_internal_error ("invalid address space"); if (nr_bytes == 12) - error("sem_attach_address_callback() invalid size\n"); + sim_io_internal_error ("invalid size"); sem->physical_address = addr; DTRACE(sem, ("semaphore physical_address=0x%x\n", addr)); @@ -202,13 +202,13 @@ hw_sem_io_read_buffer(device *me, DTRACE(sem, ("semaphore read addr=0x%x length=%d\n", addr, nr_bytes)); if (!(addr >= sem->physical_address && addr <= sem->physical_address + 11)) - error("hw_sem_io_read_buffer() invalid address - out of range\n"); + sim_io_internal_error ("invalid address - out of range"); if ((addr % 4) != 0) - error("hw_sem_io_read_buffer() invalid address - alignment\n"); + sim_io_internal_error ("invalid address - alignment"); if (nr_bytes != 4) - error("hw_sem_io_read_buffer() invalid length\n"); + sim_io_internal_error ("invalid length"); switch ( (addr - sem->physical_address) / 4 ) { @@ -223,7 +223,7 @@ hw_sem_io_read_buffer(device *me, status = semop(sem->id, &sb, 1); if (status == -1) { perror( "hw_sem.c: lock" ); - error("hw_sem_io_read_buffer() sem lock\n"); + sim_io_internal_error ("sem lock"); } DTRACE(sem, ("semaphore lock %d\n", sem->count)); @@ -237,14 +237,13 @@ hw_sem_io_read_buffer(device *me, status = semop(sem->id, &sb, 1); if (status == -1) { perror( "hw_sem.c: unlock" ); - error("hw_sem_io_read_buffer() sem unlock\n"); + sim_io_internal_error ("sem unlock"); } DTRACE(sem, ("semaphore unlock %d\n", sem->count)); break; default: - error("hw_sem_io_read_buffer() invalid address - unknown error\n"); - break; + sim_io_internal_error ("invalid address - unknown error"); } /* assume target is big endian */ @@ -253,7 +252,7 @@ hw_sem_io_read_buffer(device *me, DTRACE(sem, ("semaphore OS value (%d)\n", u32) ); if (u32 == 0xffffffff) { perror( "hw_sem.c: getval" ); - error("hw_sem_io_read_buffer() semctl -- get value failed\n"); + sim_io_internal_error ("semctl -- get value failed"); } memcpy(dest, &u32, nr_bytes); diff --git a/sim/ppc/hw_shm.c b/sim/ppc/hw_shm.c index 3128871..75fb100 100644 --- a/sim/ppc/hw_shm.c +++ b/sim/ppc/hw_shm.c @@ -102,14 +102,14 @@ hw_shm_init_data(device *me) /* Obtain the Key Value */ if (device_find_property(me, "key") == NULL) - error("shm_init_data() required key property is missing\n"); + sim_io_internal_error ("shm_init_data() required key property is missing\n"); shm->key = (key_t) device_find_integer_property(me, "key"); DTRACE(shm, ("shm key (0x%08x)\n", shm->key) ); /* Figure out where this memory is in address space and how long it is */ if ( !device_find_reg_array_property(me, "reg", 0, ®) ) - error("hw_shm_init_data() no address registered\n"); + sim_io_internal_error ("no address registered"); /* Determine the address and length being as paranoid as possible */ shm->physical_address = 0xffffffff; @@ -138,11 +138,11 @@ hw_shm_init_data(device *me) /* Now actually attach to or create the shared memory area */ shm->id = shmget(shm->key, shm->sizeof_memory, IPC_CREAT | 0660); if (shm->id == -1) - error("hw_shm_init_data() shmget failed\n"); + sim_io_internal_error ("shmget failed"); shm->shm_address = shmat(shm->id, (char *)0, SHM_RND); if (shm->shm_address == (void *)-1) - error("hw_shm_init_data() shmat failed\n"); + sim_io_internal_error ("shmat failed"); } static void @@ -157,10 +157,10 @@ hw_shm_attach_address_callback(device *me, hw_shm_device *shm = (hw_shm_device*)device_data(me); if (space != 0) - error("shm_attach_address_callback() invalid address space\n"); + sim_io_internal_error ("invalid address space"); if (nr_bytes == 0) - error("shm_attach_address_callback() invalid size\n"); + sim_io_internal_error ("invalid size"); } diff --git a/sim/ppc/igen.c b/sim/ppc/igen.c index 5a1df3e..321e225 100644 --- a/sim/ppc/igen.c +++ b/sim/ppc/igen.c @@ -440,7 +440,7 @@ main(int argc, code |= generate_with_icache; break; default: - error (NULL, "Expecting -Ggen-icache or -Ggen-icache=\n"); + psim_fatal_error ("Expecting -Ggen-icache or -Ggen-icache=\n"); } } } @@ -557,7 +557,7 @@ main(int argc, real_file_name = NULL; break; default: - error("unknown option\n"); + psim_fatal_error ("unknown option\n"); } } return 0; diff --git a/sim/ppc/interrupts.c b/sim/ppc/interrupts.c index db100fd..9c4b0ba 100644 --- a/sim/ppc/interrupts.c +++ b/sim/ppc/interrupts.c @@ -141,8 +141,7 @@ machine_check_interrupt(cpu *processor, cpu_restart(processor, cia); default: - error("internal error - machine_check_interrupt - bad switch"); - + sim_io_internal_error ("bad switch"); } } @@ -159,8 +158,7 @@ data_storage_interrupt(cpu *processor, case USER_ENVIRONMENT: case VIRTUAL_ENVIRONMENT: - error("internal error - data_storage_interrupt - should not be called in VEA mode"); - break; + sim_io_internal_error ("should not be called in VEA mode"); case OPERATING_ENVIRONMENT: { @@ -185,8 +183,7 @@ data_storage_interrupt(cpu *processor, DSISR = dsisr_earwax_disabled | direction; break; default: - error("internal error - data_storage_interrupt - reason %d not implemented", reason); - break; + sim_io_internal_error ("reason %d not implemented", reason); } DAR = (spreg)ea; TRACE(trace_interrupts, ("data storage interrupt - cia=0x%lx DAR=0x%lx DSISR=0x%lx\n", @@ -198,8 +195,7 @@ data_storage_interrupt(cpu *processor, } default: - error("internal error - data_storage_interrupt - bad switch"); - + sim_io_internal_error ("bad switch"); } } @@ -214,7 +210,7 @@ instruction_storage_interrupt(cpu *processor, case USER_ENVIRONMENT: case VIRTUAL_ENVIRONMENT: - error("internal error - instruction_storage_interrupt - should not be called in VEA mode"); + sim_io_internal_error ("should not be called in VEA mode"); case OPERATING_ENVIRONMENT: { @@ -234,7 +230,7 @@ instruction_storage_interrupt(cpu *processor, break; default: srr1_set = 0; - error("internal error - instruction_storage_interrupt - reason %d not implemented"); + sim_io_internal_error ("reason %d not implemented"); break; } TRACE(trace_interrupts, ("instruction storage interrupt - cia=0x%lx SRR1|=0x%lx\n", @@ -245,8 +241,7 @@ instruction_storage_interrupt(cpu *processor, } default: - error("internal error - instruction_storage_interrupt - bad switch"); - + sim_io_internal_error ("bad switch"); } } @@ -275,8 +270,7 @@ alignment_interrupt(cpu *processor, cpu_restart(processor, cia); default: - error("internal error - alignment_interrupt - bad switch"); - + sim_io_internal_error ("bad switch"); } } @@ -319,7 +313,7 @@ program_interrupt(cpu *processor, "problematic branch detected, see MPC860 C0 errata"); break; default: - error("internal error - program_interrupt - reason %d not implemented", reason); + sim_io_internal_error ("reason %d not implemented", reason); } case OPERATING_ENVIRONMENT: @@ -346,7 +340,7 @@ program_interrupt(cpu *processor, break; default: srr1_set = 0; - error("internal error - program_interrupt - reason %d not implemented", reason); + sim_io_internal_error ("reason %d not implemented", reason); break; } TRACE(trace_interrupts, ("program interrupt - cia=0x%lx SRR1|=0x%lx\n", @@ -357,8 +351,7 @@ program_interrupt(cpu *processor, } default: - error("internal error - program_interrupt - bad switch"); - + sim_io_internal_error ("bad switch"); } } @@ -381,8 +374,7 @@ floating_point_unavailable_interrupt(cpu *processor, cpu_restart(processor, cia); default: - error("internal error - floating_point_unavailable_interrupt - bad switch"); - + sim_io_internal_error ("bad switch"); } } @@ -406,8 +398,7 @@ system_call_interrupt(cpu *processor, cpu_restart(processor, cia); default: - error("internal error - system_call_interrupt - bad switch"); - + sim_io_internal_error ("bad switch"); } } @@ -428,8 +419,7 @@ floating_point_assist_interrupt(cpu *processor, cpu_restart(processor, cia); default: - error("internal error - floating_point_assist_interrupt - bad switch"); - + sim_io_internal_error ("bad switch"); } } diff --git a/sim/ppc/ld-cache.c b/sim/ppc/ld-cache.c index 29a7035..dfd0da9 100644 --- a/sim/ppc/ld-cache.c +++ b/sim/ppc/ld-cache.c @@ -118,7 +118,7 @@ main(int argc, char **argv) { cache_table *rules; if (argc != 3) - error("Usage: cache \n"); + psim_fatal_error ("Usage: cache \n"); rules = load_cache_table(argv[1], a2i(argv[2])); dump_cache_rules(rules, 0); return 0; diff --git a/sim/ppc/ld-decode.c b/sim/ppc/ld-decode.c index 3b2e1a0..dc69baf 100644 --- a/sim/ppc/ld-decode.c +++ b/sim/ppc/ld-decode.c @@ -146,7 +146,7 @@ main(int argc, char **argv) { decode_table *rules; if (argc != 3) - error("Usage: decode \n"); + psim_fatal_error ("Usage: decode \n"); rules = load_decode_table(argv[1], a2i(argv[2])); dump_decode_rules(rules, 0); return 0; diff --git a/sim/ppc/ld-insn.c b/sim/ppc/ld-insn.c index e39131c..b673615 100644 --- a/sim/ppc/ld-insn.c +++ b/sim/ppc/ld-insn.c @@ -92,8 +92,8 @@ parse_insn_format(table_entry *entry, /* sanity check */ if (!isdigit(*chp)) { - error("%s:%d: missing position field at `%s'\n", - entry->file_name, entry->line_nr, chp); + psim_fatal_error ("%s:%d: missing position field at `%s'\n", + entry->file_name, entry->line_nr, chp); } /* break out the bit position */ @@ -104,8 +104,8 @@ parse_insn_format(table_entry *entry, if (*chp == '.' && strlen_pos > 0) chp++; else { - error("%s:%d: missing field value at %s\n", - entry->file_name, entry->line_nr, chp); + psim_fatal_error ("%s:%d: missing field value at %s\n", + entry->file_name, entry->line_nr, chp); break; } @@ -119,8 +119,8 @@ parse_insn_format(table_entry *entry, if (*chp == ',') chp++; else if (*chp != '\0' || strlen_val == 0) { - error("%s:%d: missing field terminator at %s\n", - entry->file_name, entry->line_nr, chp); + psim_fatal_error ("%s:%d: missing field terminator at %s\n", + entry->file_name, entry->line_nr, chp); break; } @@ -198,7 +198,7 @@ parse_include_entry (table *file, { /* parse the include file_entry */ if (file_entry->nr_fields < 4) - error ("Incorrect nr fields for include record\n"); + psim_fatal_error ("Incorrect nr fields for include record\n"); /* process it */ if (!is_filtered_out(file_entry->fields[include_flags], filters)) { @@ -308,8 +308,8 @@ insn_table_insert_insn(insn_table *table, } if (!model_ptr) - error("%s:%d: machine model `%s' was not known about\n", - file_entry->file_name, file_entry->line_nr, name); + psim_fatal_error("%s:%d: machine model `%s' was not known about\n", + file_entry->file_name, file_entry->line_nr, name); } /* insert it according to the order of the fields */ @@ -645,7 +645,7 @@ insn_table_find_opcode_field(insn *insns, curr_opcode->boolean_constant = rule->special_constant; break; default: - error("Something is going wrong\n"); + psim_fatal_error ("Something is going wrong\n"); } return curr_opcode; @@ -972,7 +972,8 @@ main(int argc, char **argv) cache_table *cache_rules = NULL; if (argc != 5) - error("Usage: insn \n"); + psim_fatal_error ("\ +Usage: insn \n"); filters = new_filter(argv[1], filters); hi_bit_nr = a2i(argv[2]); diff --git a/sim/ppc/lf.c b/sim/ppc/lf.c index 1794a27..d0d3f6a 100644 --- a/sim/ppc/lf.c +++ b/sim/ppc/lf.c @@ -217,7 +217,7 @@ lf_print__c_code(lf *file, chp++; } if (in_bit_field) - error("bit field paren miss match some where\n"); + psim_fatal_error ("bit field paren miss match some where\n"); if (*chp == '\n') { nr += lf_putchr(file, '\n'); chp++; diff --git a/sim/ppc/main.c b/sim/ppc/main.c index 667c02f..d2c8060 100644 --- a/sim/ppc/main.c +++ b/sim/ppc/main.c @@ -78,7 +78,7 @@ sim_io_printf_filtered(const char *msg, ...) } void -error (const char *msg, ...) +psim_fatal_error (const char *msg, ...) { va_list ap; va_start(ap, msg); @@ -111,7 +111,7 @@ sim_io_write_stdout(const char *buf, return write(1, buf, sizeof_buf); break; default: - error("sim_io_write_stdout: invalid switch\n"); + sim_io_internal_error ("sim_io_write_stdout: invalid switch\n"); } return 0; } @@ -134,7 +134,7 @@ sim_io_write_stderr(const char *buf, return write(2, buf, sizeof_buf); break; default: - error("sim_io_write_stdout: invalid switch\n"); + sim_io_internal_error ("sim_io_write_stdout: invalid switch\n"); } return 0; } @@ -204,7 +204,7 @@ sim_io_read_stdin(char *buf, break; #endif default: - error("sim_io_read_stdin: invalid switch\n"); + sim_io_internal_error ("invalid switch"); break; } return 0; @@ -220,19 +220,16 @@ sim_io_flush_stdoutput(void) case DONT_USE_STDIO: break; default: - error("sim_io_flush_stdoutput: invalid switch\n"); + sim_io_internal_error ("invalid switch"); break; } } -void -sim_io_error (SIM_DESC sd, const char *msg, ...) +static void +sim_io_verror (const char *msg, va_list ap) { - va_list ap; - va_start(ap, msg); vprintf(msg, ap); printf("\n"); - va_end(ap); /* any final clean up */ if (ppc_trace[trace_print_info] && simulation != NULL) @@ -241,13 +238,34 @@ sim_io_error (SIM_DESC sd, const char *msg, ...) exit (1); } +void +sim_io_error (const char *msg, ...) +{ + va_list ap; + + va_start (ap, msg); + sim_io_verror (msg, ap); + va_end (ap); +} + +void +sim_io_internal_error_1 (const char *file, int line, + const char *msg, ...) +{ + va_list ap; + + printf ("%s:%d: ", file, line); + va_start (ap, msg); + sim_io_verror (msg, ap); + va_end (ap); +} void * zalloc(long size) { void *memory = malloc(size); if (memory == NULL) - error("zalloc failed\n"); + sim_io_internal_error ("zalloc failed"); memset(memory, 0, size); return memory; } @@ -312,11 +330,9 @@ main(int argc, char **argv) status = psim_get_status(simulation); switch (status.reason) { case was_continuing: - error("psim: continuing while stopped!\n"); - return 0; + psim_fatal_error ("psim: continuing while stopped!\n"); case was_trap: - error("psim: no trap insn\n"); - return 0; + psim_fatal_error ("psim: no trap insn\n"); case was_exited: return status.signal; case was_signalled: @@ -325,7 +341,6 @@ main(int argc, char **argv) (long)status.program_counter); return status.signal; default: - error("unknown halt condition\n"); - return 0; + psim_fatal_error ("unknown halt condition\n"); } } diff --git a/sim/ppc/misc.c b/sim/ppc/misc.c index 8c21bd3..223abdc 100644 --- a/sim/ppc/misc.c +++ b/sim/ppc/misc.c @@ -38,7 +38,7 @@ #endif void -error (char *msg, ...) +psim_fatal_error (const char *msg, ...) { va_list ap; va_start(ap, msg); @@ -52,7 +52,7 @@ zalloc(long size) { void *memory = malloc(size); if (memory == NULL) - error("zalloc failed\n"); + psim_fatal_error ("zalloc failed\n"); memset(memory, 0, size); return memory; } @@ -196,7 +196,7 @@ name2i(const char *names, if (curr->i >= 0) return curr->i; else - error("%s contains no valid names\n", names); + psim_fatal_error ("%s contains no valid names\n", names); return 0; } @@ -209,6 +209,6 @@ i2name(const int i, return map->name; map++; } - error("map lookup failed for %d\n", i); + psim_fatal_error ("map lookup failed for %d\n", i); return NULL; } diff --git a/sim/ppc/misc.h b/sim/ppc/misc.h index 232f2ea..29c662c 100644 --- a/sim/ppc/misc.h +++ b/sim/ppc/misc.h @@ -42,19 +42,19 @@ #endif - #include "filter_filename.h" -extern void error -(char *msg, ...); - -#define ASSERT(EXPRESSION) \ -do { \ - if (!(EXPRESSION)) { \ - error("%s:%d: assertion failed - %s\n", \ - filter_filename (__FILE__), __LINE__, #EXPRESSION); \ - } \ -} while (0) +extern void psim_fatal_error (const char *msg, ...); + +#define ASSERT(EXPRESSION) \ + do { \ + if (!(EXPRESSION)) \ + { \ + psim_fatal_error ("%s:%d: assertion failed - %s\n", \ + filter_filename (__FILE__), \ + __LINE__, #EXPRESSION); \ + } \ + } while (0) #define ZALLOC(TYPE) (TYPE*)zalloc(sizeof(TYPE)) #define NZALLOC(TYPE,N) ((TYPE*) zalloc (sizeof(TYPE) * (N))) diff --git a/sim/ppc/mon.c b/sim/ppc/mon.c index 8235b66..921bad3 100644 --- a/sim/ppc/mon.c +++ b/sim/ppc/mon.c @@ -98,7 +98,7 @@ mon_cpu(mon *monitor, int cpu_nr) { if (cpu_nr < 0 || cpu_nr >= MAX_NR_PROCESSORS) - error("mon_cpu() - invalid cpu number\n"); + sim_io_internal_error ("invalid cpu number"); return &monitor->cpu_monitor[cpu_nr]; } diff --git a/sim/ppc/os_emul.c b/sim/ppc/os_emul.c index 73792c9..4e532e7 100644 --- a/sim/ppc/os_emul.c +++ b/sim/ppc/os_emul.c @@ -56,7 +56,7 @@ os_emul_create(const char *file_name, image = bfd_openr(file_name, NULL); if (image == NULL) { bfd_perror(file_name); - error("nothing loaded\n"); + sim_io_error ("nothing loaded"); } /* check it is an executable */ @@ -125,7 +125,7 @@ os_emul_system_call(cpu *processor, if (emulation != (os_emul*)0 && emulation->system_call != 0) emulation->system_call(processor, cia, emulation->data); else - error("System call emulation not available\n"); + sim_io_error ("System call emulation not available"); } INLINE_OS_EMUL\ diff --git a/sim/ppc/ppc-instructions b/sim/ppc/ppc-instructions index 1a2e51a..6b7c931 100644 --- a/sim/ppc/ppc-instructions +++ b/sim/ppc/ppc-instructions @@ -803,7 +803,7 @@ model_data *::model-function::model_create:cpu *processor case MODEL_ppc603: model_ptr->max_nr_writebacks = 2; break; case MODEL_ppc603e: model_ptr->max_nr_writebacks = 2; break; case MODEL_ppc604: model_ptr->max_nr_writebacks = 2; break; - default: error ("Unknown model %d\n", CURRENT_MODEL); + default: sim_io_internal_error ("Unknown model %d", CURRENT_MODEL); } return model_ptr; @@ -1032,7 +1032,7 @@ unsigned64::function::DOUBLE:unsigned32 WORD | INSERTED64(EXTRACTED32(WORD, 2, 31), 5, (63 - 29))); } else { - error("DOUBLE - unknown case\n"); + sim_io_internal_error ("unknown case"); FRT = 0; } return FRT; @@ -1357,7 +1357,7 @@ unsigned64::function::select_qnan:unsigned64 fra, unsigned64 frb, unsigned64 frc else if (generate_qnan) frt = MASK64(1, 12); /* 0x7FF8_0000_0000_0000 */ else - error("select_qnan - default reached\n"); + sim_io_internal_error ("default reached"); return frt; @@ -1430,10 +1430,10 @@ void::function::invalid_arithemetic_operation:cpu *processor, unsigned_word cia, else { /* invalid operation exception disabled */ if (instruction_is_convert_to_64bit) { - error("oopsi"); + sim_io_internal_error ("oopsi"); } else if (instruction_is_convert_to_32bit) { - error("oopsi"); + sim_io_internal_error ("oopsi"); } else { /* arrith, frsp */ *frt = select_qnan(fra, frb, frc, diff --git a/sim/ppc/psim.c b/sim/ppc/psim.c index 3e322e3..6ccbf5f 100644 --- a/sim/ppc/psim.c +++ b/sim/ppc/psim.c @@ -112,7 +112,7 @@ find_arg(char *err_msg, { *ptr_to_argp += 1; if (argv[*ptr_to_argp] == NULL) - error(err_msg); + sim_io_internal_error (err_msg); return argv[*ptr_to_argp]; } @@ -332,7 +332,8 @@ psim_options(device *root, { tree_parse(root, "/options/mpc860c0 %s", param+9); } - else error("Invalid mpc860c0 option for -o\n"); + else + sim_io_error ("Invalid mpc860c0 option for -o"); } else current = tree_parse(current, "%s", param); diff --git a/sim/ppc/sim_callbacks.h b/sim/ppc/sim_callbacks.h index 61c6e2f..3d9bdd1 100644 --- a/sim/ppc/sim_callbacks.h +++ b/sim/ppc/sim_callbacks.h @@ -29,8 +29,19 @@ void sim_io_printf_filtered (const char *msg, ...) __attribute__ ((format (printf, 1, 2))); -void NORETURN error -(const char *msg, ...); +void NORETURN sim_io_error +(const char *msg, ...) __attribute__ ((format (printf, 1, 2))); + +void NORETURN sim_io_internal_error_1 (const char *file, int line, + const char *msg, ...) + __attribute__ ((format (printf, 3, 4))); + +#define sim_io_internal_error(...) \ + sim_io_internal_error_1 (__FILE__, __LINE__, __VA_ARGS__) + +/* Hack to catch calls to error with a hard error. */ +struct foo {}; +void NORETURN error (struct foo t); /* External environment: diff --git a/sim/ppc/sim_calls.c b/sim/ppc/sim_calls.c index 470c958..b2e9b2f 100644 --- a/sim/ppc/sim_calls.c +++ b/sim/ppc/sim_calls.c @@ -116,14 +116,14 @@ sim_load (SIM_DESC sd, const char *prog, bfd *abfd, int from_tty) { abfd = bfd_openr (prog, 0); if (abfd == NULL) - error ("psim: can't open \"%s\": %s\n", - prog, bfd_errmsg (bfd_get_error ())); + sim_io_error ("psim: can't open \"%s\": %s\n", + prog, bfd_errmsg (bfd_get_error ())); if (!bfd_check_format (abfd, bfd_object)) { const char *errmsg = bfd_errmsg (bfd_get_error ()); bfd_close (abfd); - error ("psim: \"%s\" is not an object file: %s\n", - prog, errmsg); + sim_io_error ("psim: \"%s\" is not an object file: %s\n", + prog, errmsg); } bfd_close (abfd); } @@ -173,7 +173,7 @@ sim_create_inferior (SIM_DESC sd, entry_point)); if (simulator == NULL) - error ("No program loaded"); + sim_io_error ("No program loaded"); if (abfd != NULL) entry_point = bfd_get_start_address (abfd); @@ -299,7 +299,7 @@ sim_io_read_stdin(char *buf, return callbacks->read(callbacks, 0, buf, sizeof_buf); break; default: - error("sim_io_read_stdin: unaccounted switch\n"); + sim_io_internal_error ("unaccounted switch"); break; } return 0; @@ -317,7 +317,7 @@ sim_io_write_stdout(const char *buf, return callbacks->write(callbacks, 1, buf, sizeof_buf); break; default: - error("sim_io_write_stdout: unaccounted switch\n"); + sim_io_internal_error ("unaccounted switch"); break; } return 0; @@ -336,7 +336,7 @@ sim_io_write_stderr(const char *buf, return callbacks->write(callbacks, 3, buf, sizeof_buf); break; default: - error("sim_io_write_stderr: unaccounted switch\n"); + sim_io_internal_error ("unaccounted switch"); break; } return 0; @@ -355,7 +355,7 @@ sim_io_printf_filtered(const char *fmt, va_end(ap); /* sanity check */ if (strlen(message) >= sizeof(message)) - error("sim_io_printf_filtered: buffer overflow\n"); + sim_io_internal_error ("buffer overflow"); callbacks->printf_filtered(callbacks, "%s", message); } @@ -369,13 +369,23 @@ sim_io_flush_stdoutput(void) case DONT_USE_STDIO: break; default: - error("sim_io_read_stdin: unaccounted switch\n"); - break; + sim_io_internal_error ("unaccounted switch"); } } void -sim_io_error (SIM_DESC sd, const char *fmt, ...) +sim_io_error (const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + callbacks->evprintf_filtered (callbacks, fmt, ap); + va_end(ap); + callbacks->error (callbacks, ""); +} + +void +sim_io_internal_error_1 (const char *file, int line, + const char *fmt, ...) { va_list ap; va_start(ap, fmt); @@ -390,8 +400,6 @@ void * zalloc(long size) { void *memory = (void*)xmalloc(size); - if (memory == NULL) - error("xmalloc failed\n"); memset(memory, 0, size); return memory; } diff --git a/sim/ppc/table.c b/sim/ppc/table.c index 43c7462..2975b93 100644 --- a/sim/ppc/table.c +++ b/sim/ppc/table.c @@ -104,7 +104,7 @@ table_push (table *root, /* free (dup_name); */ if (include->next == NULL) { - error ("Problem opening file `%s'\n", file_name); + fprintf (stderr, "Problem opening file `%s'\n", file_name); perror (file_name); exit (1); } diff --git a/sim/ppc/tree.c b/sim/ppc/tree.c index 5d20bf4..d135a21 100644 --- a/sim/ppc/tree.c +++ b/sim/ppc/tree.c @@ -95,7 +95,7 @@ split_device_specifier(device *current, alias[len] = device_specifier[len]; len++; if (len >= sizeof(alias)) - error("split_device_specifier: buffer overflow"); + sim_io_error ("split_device_specifier: buffer overflow"); } alias[len] = '\0'; if (aliases != NULL @@ -113,7 +113,7 @@ split_device_specifier(device *current, /* check no overflow */ if (strlen(spec->buf) >= sizeof(spec->buf)) - error("split_device_specifier: buffer overflow\n"); + sim_io_error ("split_device_specifier: buffer overflow\n"); /* strip leading spaces */ chp = spec->buf; @@ -811,7 +811,7 @@ tree_parse(device *current, vsprintf(device_specifier, fmt, ap); va_end(ap); if (strlen(device_specifier) >= sizeof(device_specifier)) - error("device_tree_add_deviced: buffer overflow\n"); + sim_io_internal_error ("device_tree_add_deviced: buffer overflow\n"); } /* construct the tree down to the final device */ diff --git a/sim/ppc/vm.c b/sim/ppc/vm.c index 8cf4e8f..3f13af3 100644 --- a/sim/ppc/vm.c +++ b/sim/ppc/vm.c @@ -456,11 +456,11 @@ vm_create(core *physical) if (nr_om_segment_tlb_entries != (1 << (om_segment_tlb_index_stop_bit - om_segment_tlb_index_start_bit + 1))) - error("internal error - vm_create - problem with om_segment constants\n"); + sim_io_internal_error ("problem with om_segment constants"); if (nr_om_page_tlb_entries != (1 << (om_page_tlb_index_stop_bit - om_page_tlb_index_start_bit + 1))) - error("internal error - vm_create - problem with om_page constants\n"); + sim_io_internal_error ("problem with om_page constants"); /* create the new vm register file */ virtual = ZALLOC(vm); @@ -698,7 +698,7 @@ om_interrupt(cpu *processor, instruction_storage_interrupt(processor, cia, reason); break; default: - error("internal error - om_interrupt - unexpected access type %d", access); + sim_io_internal_error ("unexpected access type %d", access); } } @@ -1054,7 +1054,7 @@ vm_translate(om_map *map, processor, cia, abort); default: - error("internal error - vm_translate - bad switch"); + sim_io_internal_error ("bad switch"); return 0; } } diff --git a/sim/ppc/vm_n.h b/sim/ppc/vm_n.h index 563cd1c..a066c58 100644 --- a/sim/ppc/vm_n.h +++ b/sim/ppc/vm_n.h @@ -73,7 +73,7 @@ vm_data_map_read_N(vm_data_map *map, return val; } default: - error("internal error - vm_data_map_read_N - bad switch"); + sim_io_internal_error ("bad switch"); return 0; } } @@ -120,7 +120,7 @@ vm_data_map_write_N(vm_data_map *map, } break; default: - error("internal error - vm_data_map_write_N - bad switch"); + sim_io_internal_error ("bad switch"); } } } -- 2.5.5