/* Implement the attach target_ops method. */
-static int
-lynx_attach (unsigned long pid)
+int
+lynx_process_target::attach (unsigned long pid)
{
ptid_t ptid = lynx_ptid_t (pid, 0);
/* Implement the resume target_ops method. */
-static void
-lynx_resume (struct thread_resume *resume_info, size_t n)
+void
+lynx_process_target::resume (thread_resume *resume_info, size_t n)
{
ptid_t ptid = resume_info[0].thread;
const int request
/* A wrapper around lynx_wait_1 that also prints debug traces when
such debug traces have been activated. */
-static ptid_t
-lynx_wait (ptid_t ptid, struct target_waitstatus *status, int options)
+ptid_t
+lynx_process_target::wait (ptid_t ptid, target_waitstatus *status,
+ int options)
{
ptid_t new_ptid;
- lynx_debug ("lynx_wait (pid = %d, tid = %ld)",
+ lynx_debug ("wait (pid = %d, tid = %ld)",
lynx_ptid_get_pid (ptid), lynx_ptid_get_tid (ptid));
new_ptid = lynx_wait_1 (ptid, status, options);
lynx_debug (" -> (pid=%d, tid=%ld, status->kind = %d)",
/* Implement the kill target_ops method. */
-static int
-lynx_kill (process_info *process)
+int
+lynx_process_target::kill (process_info *process)
{
ptid_t ptid = lynx_ptid_t (process->pid, 0);
struct target_waitstatus status;
lynx_ptrace (PTRACE_KILL, ptid, 0, 0, 0);
lynx_wait (ptid, &status, 0);
- the_target->mourn (process);
+ mourn (process);
return 0;
}
/* Implement the detach target_ops method. */
-static int
-lynx_detach (process_info *process)
+int
+lynx_process_target::detach (process_info *process)
{
ptid_t ptid = lynx_ptid_t (process->pid, 0);
lynx_ptrace (PTRACE_DETACH, ptid, 0, 0, 0);
- the_target->mourn (process);
+ mourn (process);
return 0;
}
/* Implement the mourn target_ops method. */
-static void
-lynx_mourn (struct process_info *proc)
+void
+lynx_process_target::mourn (struct process_info *proc)
{
for_each_thread (proc->pid, remove_thread);
/* Implement the join target_ops method. */
-static void
-lynx_join (int pid)
+void
+lynx_process_target::join (int pid)
{
/* The PTRACE_DETACH is sufficient to detach from the process.
So no need to do anything extra. */
/* Implement the thread_alive target_ops method. */
-static int
-lynx_thread_alive (ptid_t ptid)
+bool
+lynx_process_target::thread_alive (ptid_t ptid)
{
/* The list of threads is updated at the end of each wait, so it
should be up to date. No need to re-fetch it. */
/* Implement the fetch_registers target_ops method. */
-static void
-lynx_fetch_registers (struct regcache *regcache, int regno)
+void
+lynx_process_target::fetch_registers (regcache *regcache, int regno)
{
struct lynx_regset_info *regset = lynx_target_regsets;
ptid_t inferior_ptid = ptid_of (current_thread);
- lynx_debug ("lynx_fetch_registers (regno = %d)", regno);
+ lynx_debug ("fetch_registers (regno = %d)", regno);
while (regset->size >= 0)
{
/* Implement the store_registers target_ops method. */
-static void
-lynx_store_registers (struct regcache *regcache, int regno)
+void
+lynx_process_target::store_registers (regcache *regcache, int regno)
{
struct lynx_regset_info *regset = lynx_target_regsets;
ptid_t inferior_ptid = ptid_of (current_thread);
- lynx_debug ("lynx_store_registers (regno = %d)", regno);
+ lynx_debug ("store_registers (regno = %d)", regno);
while (regset->size >= 0)
{
/* Implement the read_memory target_ops method. */
-static int
-lynx_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
+int
+lynx_process_target::read_memory (CORE_ADDR memaddr, unsigned char *myaddr,
+ int len)
{
/* On LynxOS, memory reads needs to be performed in chunks the size
of int types, and they should also be aligned accordingly. */
/* Implement the write_memory target_ops method. */
-static int
-lynx_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
+int
+lynx_process_target::write_memory (CORE_ADDR memaddr,
+ const unsigned char *myaddr, int len)
{
/* On LynxOS, memory writes needs to be performed in chunks the size
of int types, and they should also be aligned accordingly. */
{
/* We need to read the memory at this address in order to preserve
the data that we are not overwriting. */
- lynx_read_memory (addr, (unsigned char *) &buf, xfer_size);
+ read_memory (addr, (unsigned char *) &buf, xfer_size);
if (errno)
return errno;
}
/* Implement the kill_request target_ops method. */
-static void
-lynx_request_interrupt (void)
+void
+lynx_process_target::request_interrupt ()
{
ptid_t inferior_ptid = ptid_of (get_first_thread ());
kill (lynx_ptid_get_pid (inferior_ptid), SIGINT);
}
+bool
+lynx_process_target::supports_hardware_single_step ()
+{
+ return true;
+}
+
+const gdb_byte *
+lynx_process_target::sw_breakpoint_from_kind (int kind, int *size)
+{
+ error (_("Target does not implement the sw_breakpoint_from_kind op"));
+}
+
/* The LynxOS target ops object. */
static lynx_process_target the_lynx_target;
-/* The LynxOS target_ops vector. */
-
-static process_stratum_target lynx_target_ops = {
- lynx_attach,
- lynx_kill,
- lynx_detach,
- lynx_mourn,
- lynx_join,
- lynx_thread_alive,
- lynx_resume,
- lynx_wait,
- lynx_fetch_registers,
- lynx_store_registers,
- NULL, /* prepare_to_access_memory */
- NULL, /* done_accessing_memory */
- lynx_read_memory,
- lynx_write_memory,
- NULL, /* look_up_symbols */
- lynx_request_interrupt,
- NULL, /* read_auxv */
- NULL, /* supports_z_point_type */
- NULL, /* insert_point */
- NULL, /* remove_point */
- NULL, /* stopped_by_sw_breakpoint */
- NULL, /* supports_stopped_by_sw_breakpoint */
- NULL, /* stopped_by_hw_breakpoint */
- NULL, /* supports_stopped_by_hw_breakpoint */
- target_can_do_hardware_single_step,
- NULL, /* stopped_by_watchpoint */
- NULL, /* stopped_data_address */
- NULL, /* read_offsets */
- NULL, /* get_tls_address */
- NULL, /* hostio_last_error */
- NULL, /* qxfer_osdata */
- NULL, /* qxfer_siginfo */
- NULL, /* supports_non_stop */
- NULL, /* async */
- NULL, /* start_non_stop */
- NULL, /* supports_multi_process */
- NULL, /* supports_fork_events */
- NULL, /* supports_vfork_events */
- NULL, /* supports_exec_events */
- NULL, /* handle_new_gdb_connection */
- NULL, /* handle_monitor_command */
- NULL, /* core_of_thread */
- NULL, /* read_loadmap */
- NULL, /* process_qsupported */
- NULL, /* supports_tracepoints */
- NULL, /* read_pc */
- NULL, /* write_pc */
- NULL, /* thread_stopped */
- NULL, /* get_tib_address */
- NULL, /* pause_all */
- NULL, /* unpause_all */
- NULL, /* stabilize_threads */
- NULL, /* install_fast_tracepoint_jump_pad */
- NULL, /* emit_ops */
- NULL, /* supports_disable_randomization */
- NULL, /* get_min_fast_tracepoint_insn_len */
- NULL, /* qxfer_libraries_svr4 */
- NULL, /* support_agent */
- NULL, /* enable_btrace */
- NULL, /* disable_btrace */
- NULL, /* read_btrace */
- NULL, /* read_btrace_conf */
- NULL, /* supports_range_stepping */
- NULL, /* pid_to_exec_file */
- NULL, /* multifs_open */
- NULL, /* multifs_unlink */
- NULL, /* multifs_readlink */
- NULL, /* breakpoint_kind_from_pc */
- NULL, /* sw_breakpoint_from_kind */
- NULL, /* thread_name */
- NULL, /* breakpoint_kind_from_current_state */
- NULL, /* supports_software_single_step */
- NULL, /* supports_catch_syscall */
- NULL, /* get_ipa_tdesc_idx */
- NULL, /* thread_handle */
- &the_lynx_target,
-};
-
void
initialize_low (void)
{
- set_target_ops (&lynx_target_ops);
+ set_target_ops (&the_lynx_target);
the_low_target.arch_setup ();
}