X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Fnto-low.c;h=19f492ff7701e92bf0991611a7f99ff37413b3a1;hb=c06cbd92be66d82eb323a8c6ec451c1dccc02107;hp=17548a42e1fc208639a40906402b1c3ddf91f9ce;hpb=505106cdc7c816a44bbfee11daf500f4e5e14072;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/nto-low.c b/gdb/gdbserver/nto-low.c index 17548a42e1..19f492ff77 100644 --- a/gdb/gdbserver/nto-low.c +++ b/gdb/gdbserver/nto-low.c @@ -1,6 +1,6 @@ /* QNX Neutrino specific low level interface, for the remote server for GDB. - Copyright (C) 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2009-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -19,14 +19,15 @@ #include "server.h" +#include "gdbthread.h" #include "nto-low.h" +#include "hostio.h" #include #include #include #include #include -#include #include #include @@ -34,6 +35,8 @@ extern int using_threads; int using_threads = 1; +const struct target_desc *nto_tdesc; + static void nto_trace (const char *fmt, ...) { @@ -174,7 +177,7 @@ do_attach (pid_t pid) close (nto_inferior.ctl_fd); init_nto_inferior (&nto_inferior); } - snprintf (nto_inferior.nto_procfs_path, PATH_MAX - 1, "/proc/%d/as", pid); + xsnprintf (nto_inferior.nto_procfs_path, PATH_MAX - 1, "/proc/%d/as", pid); nto_inferior.ctl_fd = open (nto_inferior.nto_procfs_path, O_RDWR); if (nto_inferior.ctl_fd == -1) { @@ -202,11 +205,13 @@ do_attach (pid_t pid) && (status.flags & _DEBUG_FLAG_STOPPED)) { ptid_t ptid; + struct process_info *proc; kill (pid, SIGCONT); ptid = ptid_build (status.pid, status.tid, 0); the_low_target.arch_setup (); - add_process (status.pid, 1); + proc = add_process (status.pid, 1); + proc->tdesc = nto_tdesc; TRACE ("Adding thread: pid=%d tid=%ld\n", status.pid, ptid_get_lwp (ptid)); nto_find_new_threads (&nto_inferior); @@ -531,14 +536,14 @@ nto_wait (ptid_t ptid, { TRACE ("SSTEP\n"); ourstatus->kind = TARGET_WAITKIND_STOPPED; - ourstatus->value.sig = TARGET_SIGNAL_TRAP; + ourstatus->value.sig = GDB_SIGNAL_TRAP; } /* Was it a breakpoint? */ else if (status.flags & trace_mask) { TRACE ("STOPPED\n"); ourstatus->kind = TARGET_WAITKIND_STOPPED; - ourstatus->value.sig = TARGET_SIGNAL_TRAP; + ourstatus->value.sig = GDB_SIGNAL_TRAP; } else if (status.flags & _DEBUG_FLAG_ISTOP) { @@ -549,7 +554,7 @@ nto_wait (ptid_t ptid, TRACE (" SIGNALLED\n"); ourstatus->kind = TARGET_WAITKIND_STOPPED; ourstatus->value.sig = - target_signal_from_host (status.info.si_signo); + gdb_signal_from_host (status.info.si_signo); nto_inferior.exit_signo = ourstatus->value.sig; break; case _DEBUG_WHY_FAULTED: @@ -563,7 +568,7 @@ nto_wait (ptid_t ptid, else { ourstatus->value.sig = - target_signal_from_host (status.info.si_signo); + gdb_signal_from_host (status.info.si_signo); nto_inferior.exit_signo = ourstatus->value.sig; } break; @@ -594,7 +599,7 @@ nto_wait (ptid_t ptid, TRACE ("REQUESTED\n"); /* We are assuming a requested stop is due to a SIGINT. */ ourstatus->kind = TARGET_WAITKIND_STOPPED; - ourstatus->value.sig = TARGET_SIGNAL_INT; + ourstatus->value.sig = GDB_SIGNAL_INT; nto_inferior.exit_signo = 0; break; } @@ -617,12 +622,12 @@ nto_fetch_registers (struct regcache *regcache, int regno) if (regno >= the_low_target.num_regs) return; - if (current_inferior == NULL) + if (current_thread == NULL) { - TRACE ("current_inferior is NULL\n"); + TRACE ("current_thread is NULL\n"); return; } - ptid = thread_to_gdb_id (current_inferior); + ptid = thread_to_gdb_id (current_thread); if (!nto_set_thread (ptid)) return; @@ -635,7 +640,8 @@ nto_fetch_registers (struct regcache *regcache, int regno) { const unsigned int registeroffset = the_low_target.register_offset (regno); - supply_register (regcache, regno, ((char *)&greg) + registeroffset); + supply_register (regcache, regno, + ((char *)&greg) + registeroffset); } } else @@ -663,12 +669,12 @@ nto_store_registers (struct regcache *regcache, int regno) TRACE ("%s (regno:%d)\n", __func__, regno); - if (current_inferior == NULL) + if (current_thread == NULL) { - TRACE ("current_inferior is NULL\n"); + TRACE ("current_thread is NULL\n"); return; } - ptid = thread_to_gdb_id (current_inferior); + ptid = thread_to_gdb_id (current_thread); if (!nto_set_thread (ptid)) return; @@ -764,30 +770,46 @@ nto_read_auxv (CORE_ADDR offset, unsigned char *myaddr, unsigned int len) return nto_read_auxv_from_initial_stack (initial_stack, myaddr, len); } -/* Insert {break/watch}point at address ADDR. - TYPE must be in '0'..'4' range. LEN is not used. */ +static int +nto_supports_z_point_type (char z_type) +{ + switch (z_type) + { + case Z_PACKET_SW_BP: + case Z_PACKET_HW_BP: + case Z_PACKET_WRITE_WP: + case Z_PACKET_READ_WP: + case Z_PACKET_ACCESS_WP: + return 1; + default: + return 0; + } +} + +/* Insert {break/watch}point at address ADDR. SIZE is not used. */ static int -nto_insert_point (char type, CORE_ADDR addr, int len) +nto_insert_point (enum raw_bkpt_type type, CORE_ADDR addr, + int size, struct raw_breakpoint *bp) { int wtype = _DEBUG_BREAK_HW; /* Always request HW. */ TRACE ("%s type:%c addr: 0x%08lx len:%d\n", __func__, (int)type, addr, len); switch (type) { - case '0': /* software-breakpoint */ + case raw_bkpt_type_sw: wtype = _DEBUG_BREAK_EXEC; break; - case '1': /* hardware-breakpoint */ + case raw_bkpt_type_hw: wtype |= _DEBUG_BREAK_EXEC; break; - case '2': /* write watchpoint */ + case raw_bkpt_type_write_wp: wtype |= _DEBUG_BREAK_RW; break; - case '3': /* read watchpoint */ + case raw_bkpt_type_read_wp: wtype |= _DEBUG_BREAK_RD; break; - case '4': /* access watchpoint */ + case raw_bkpt_type_access_wp: wtype |= _DEBUG_BREAK_RW; break; default: @@ -796,30 +818,30 @@ nto_insert_point (char type, CORE_ADDR addr, int len) return nto_breakpoint (addr, wtype, 0); } -/* Remove {break/watch}point at address ADDR. - TYPE must be in '0'..'4' range. LEN is not used. */ +/* Remove {break/watch}point at address ADDR. SIZE is not used. */ static int -nto_remove_point (char type, CORE_ADDR addr, int len) +nto_remove_point (enum raw_bkpt_type type, CORE_ADDR addr, + int size, struct raw_breakpoint *bp) { int wtype = _DEBUG_BREAK_HW; /* Always request HW. */ TRACE ("%s type:%c addr: 0x%08lx len:%d\n", __func__, (int)type, addr, len); switch (type) { - case '0': /* software-breakpoint */ + case raw_bkpt_type_sw: wtype = _DEBUG_BREAK_EXEC; break; - case '1': /* hardware-breakpoint */ + case raw_bkpt_type_hw: wtype |= _DEBUG_BREAK_EXEC; break; - case '2': /* write watchpoint */ + case raw_bkpt_type_write_wp: wtype |= _DEBUG_BREAK_RW; break; - case '3': /* read watchpoint */ + case raw_bkpt_type_read_wp: wtype |= _DEBUG_BREAK_RD; break; - case '4': /* access watchpoint */ + case raw_bkpt_type_access_wp: wtype |= _DEBUG_BREAK_RW; break; default: @@ -839,11 +861,11 @@ nto_stopped_by_watchpoint (void) int ret = 0; TRACE ("%s\n", __func__); - if (nto_inferior.ctl_fd != -1 && current_inferior != NULL) + if (nto_inferior.ctl_fd != -1 && current_thread != NULL) { ptid_t ptid; - ptid = thread_to_gdb_id (current_inferior); + ptid = thread_to_gdb_id (current_thread); if (nto_set_thread (ptid)) { const int watchmask = _DEBUG_FLAG_TRACE_RD | _DEBUG_FLAG_TRACE_WR @@ -871,11 +893,11 @@ nto_stopped_data_address (void) CORE_ADDR ret = (CORE_ADDR)0; TRACE ("%s\n", __func__); - if (nto_inferior.ctl_fd != -1 && current_inferior != NULL) + if (nto_inferior.ctl_fd != -1 && current_thread != NULL) { ptid_t ptid; - ptid = thread_to_gdb_id (current_inferior); + ptid = thread_to_gdb_id (current_thread); if (nto_set_thread (ptid)) { @@ -903,6 +925,7 @@ nto_supports_non_stop (void) static struct target_ops nto_target_ops = { nto_create_inferior, + NULL, /* arch_setup */ nto_attach, nto_kill, nto_detach, @@ -913,13 +936,24 @@ static struct target_ops nto_target_ops = { nto_wait, nto_fetch_registers, nto_store_registers, + NULL, /* prepare_to_access_memory */ + NULL, /* done_accessing_memory */ nto_read_memory, nto_write_memory, NULL, /* nto_look_up_symbols */ nto_request_interrupt, nto_read_auxv, + nto_supports_z_point_type, nto_insert_point, nto_remove_point, + NULL, /* stopped_by_sw_breakpoint */ + NULL, /* supports_stopped_by_sw_breakpoint */ + NULL, /* stopped_by_hw_breakpoint */ + NULL, /* supports_stopped_by_hw_breakpoint */ + /* Although nto has hardware single step, still disable this + feature for not, because it is implemented in linux-low.c instead + of in generic code. */ + NULL, /* supports_conditional_breakpoints */ nto_stopped_by_watchpoint, nto_stopped_data_address, NULL, /* nto_read_offsets */