struct linux_target_ops
{
- /* Returns true if the low target supports tracepoints. */
- int (*supports_tracepoints) (void);
-
- /* Fill ADDRP with the thread area address of LWPID. Returns 0 on
- success, -1 on failure. */
- int (*get_thread_area) (int lwpid, CORE_ADDR *addrp);
-
- /* Install a fast tracepoint jump pad. See target.h for
- comments. */
- int (*install_fast_tracepoint_jump_pad) (CORE_ADDR tpoint, CORE_ADDR tpaddr,
- CORE_ADDR collector,
- CORE_ADDR lockaddr,
- ULONGEST orig_size,
- CORE_ADDR *jump_entry,
- CORE_ADDR *trampoline,
- ULONGEST *trampoline_size,
- unsigned char *jjump_pad_insn,
- ULONGEST *jjump_pad_insn_size,
- CORE_ADDR *adjusted_insn_addr,
- CORE_ADDR *adjusted_insn_addr_end,
- char *err);
-
- /* Return the bytecode operations vector for the current inferior.
- Returns NULL if bytecode compilation is not supported. */
- struct emit_ops *(*emit_ops) (void);
-
- /* Return the minimum length of an instruction that can be safely overwritten
- for use as a fast tracepoint. */
- int (*get_min_fast_tracepoint_insn_len) (void);
-
- /* Returns true if the low target supports range stepping. */
- int (*supports_range_stepping) (void);
-
- /* See target.h. */
- int (*supports_hardware_single_step) (void);
-
- /* Fill *SYSNO with the syscall nr trapped. Only to be called when
- inferior is stopped due to SYSCALL_SIGTRAP. */
- void (*get_syscall_trapinfo) (struct regcache *regcache, int *sysno);
-
/* See target.h. */
int (*get_ipa_tdesc_idx) (void);
};
unsigned char *myaddr, unsigned int len) override;
#endif
- bool supports_tracepoints () override;
-
CORE_ADDR read_pc (regcache *regcache) override;
void write_pc (regcache *regcache, CORE_ADDR pc) override;
void stabilize_threads () override;
- bool supports_fast_tracepoints () override;
-
- int install_fast_tracepoint_jump_pad (CORE_ADDR tpoint,
- CORE_ADDR tpaddr,
- CORE_ADDR collector,
- CORE_ADDR lockaddr,
- ULONGEST orig_size,
- CORE_ADDR *jump_entry,
- CORE_ADDR *trampoline,
- ULONGEST *trampoline_size,
- unsigned char *jjump_pad_insn,
- ULONGEST *jjump_pad_insn_size,
- CORE_ADDR *adjusted_insn_addr,
- CORE_ADDR *adjusted_insn_addr_end,
- char *err) override;
-
- int get_min_fast_tracepoint_insn_len () override;
-
- struct emit_ops *emit_ops () override;
-
bool supports_disable_randomization () override;
bool supports_qxfer_libraries_svr4 () override;
events. */
void complete_ongoing_step_over ();
+ /* Finish a step-over. Reinsert the breakpoint we had uninserted in
+ start_step_over, if still there, and delete any single-step
+ breakpoints we've set, on non hardware single-step targets.
+ Return true if step over finished. */
+ bool finish_step_over (lwp_info *lwp);
+
/* When we finish a step-over, set threads running again. If there's
another thread that may need a step-over, now's the time to start
it. Eventually, we'll move all threads past their breakpoints. */
or can't single step. */
int single_step (lwp_info* lwp);
+ /* Return true if THREAD is doing hardware single step. */
+ bool maybe_hw_step (thread_info *thread);
+
/* Install breakpoints for software single stepping. */
void install_software_single_step_breakpoints (lwp_info *lwp);
ptid_t filter_exit_event (lwp_info *event_child,
target_waitstatus *ourstatus);
+ /* Returns true if THREAD is stopped in a jump pad, and we can't
+ move it out, because we need to report the stop event to GDB. For
+ example, if the user puts a breakpoint in the jump pad, it's
+ because she wants to debug it. */
+ bool stuck_in_jump_pad (thread_info *thread);
+
+ /* Convenience wrapper. Returns information about LWP's fast tracepoint
+ collection status. */
+ fast_tpoint_collect_result linux_fast_tracepoint_collecting
+ (lwp_info *lwp, fast_tpoint_collect_status *status);
+
+ /* This function should only be called if LWP got a SYSCALL_SIGTRAP.
+ Fill *SYSNO with the syscall nr trapped. */
+ void get_syscall_trapinfo (lwp_info *lwp, int *sysno);
+
+ /* Returns true if GDB is interested in the event_child syscall.
+ Only to be called when stopped reason is SYSCALL_SIGTRAP. */
+ bool gdb_catch_this_syscall (lwp_info *event_child);
+
protected:
/* The architecture-specific "low" methods are listed below. */
/* Hook to call prior to resuming a thread. */
virtual void low_prepare_to_resume (lwp_info *lwp);
+ /* Fill ADDRP with the thread area address of LWPID. Returns 0 on
+ success, -1 on failure. */
+ virtual int low_get_thread_area (int lwpid, CORE_ADDR *addrp);
+
+ /* Returns true if the low target supports range stepping. */
+ virtual bool low_supports_range_stepping ();
+
+ /* Return true if the target supports catch syscall. Such targets
+ override the low_get_syscall_trapinfo method below. */
+ virtual bool low_supports_catch_syscall ();
+
+ /* Fill *SYSNO with the syscall nr trapped. Only to be called when
+ inferior is stopped due to SYSCALL_SIGTRAP. */
+ virtual void low_get_syscall_trapinfo (regcache *regcache, int *sysno);
+
/* How many bytes the PC should be decremented after a break. */
virtual int low_decr_pc_after_break ();
};