33#include <unordered_map>
70 =
"system__bb__threads__initialize";
74 N_(
"Ravenscar tasks."),
75 N_(
"Ravenscar tasks support.")
91 void resume (ptid_t,
int,
enum gdb_signal)
override;
109 const gdb_byte *writebuf,
110 ULONGEST offset, ULONGEST len,
111 ULONGEST *xfered_len)
override;
124 const struct btrace_config *conf)
212 return ptid.lwp () == 0 && ptid.tid () != 0;
230 auto iter =
m_cpu_map.find (ptid.tid ());
233 base_cpu = iter->second;
238 gdb_assert (task_info != NULL);
245 base_cpu = ptid.lwp ();
266 return ptid == active_task_ptid;
284 return ptid_t (ptid.pid (), base_cpu);
309 if (active_ptid == null_ptid)
316 if (active_thr ==
nullptr)
319 m_cpu_map[active_ptid.tid ()] = base_cpu;
360 return (msym_ravenscar_runtime_initializer.
minsym
362 && msym_running_thread.
minsym);
384 CORE_ADDR object_addr;
385 struct type *builtin_type_void_data_ptr
391 object_size = builtin_type_void_data_ptr->
length ();
393 + (cpu - 1) * object_size);
394 buf_size = object_size;
395 buf = (gdb_byte *) alloca (buf_size);
402 enum gdb_signal siggnal)
410 ptid = minus_one_ptid;
412 else if (ptid != minus_one_ptid)
420 target_wait_flags options)
426 if (ptid != minus_one_ptid)
468 scoped_restore save_ptid = make_scoped_restore (&
inferior_ptid,
506 return string_printf (
"Ravenscar Thread 0x%s",
507 phex_nz (ptid.tid (), sizeof (ULONGEST)));
515 ULONGEST stack_address;
517 return (CORE_ADDR) stack_address;
523 CORE_ADDR descriptor,
524 CORE_ADDR stack_base)
const
535 gdb_byte *buf = (gdb_byte *) alloca (
size);
544 gdb_assert (
regnum != -1);
548 CORE_ADDR thread_descriptor_address
552 CORE_ADDR stack_address = 0;
570 CORE_ADDR descriptor,
571 CORE_ADDR stack_base)
const
582 gdb_byte *buf = (gdb_byte *) alloca (
size);
591 gdb_assert (
regnum != -1);
594 CORE_ADDR thread_descriptor_address
597 CORE_ADDR stack_address = 0;
648 if (fpu_context.
minsym ==
nullptr)
664 CORE_ADDR thread_descriptor_address
666 if (fpu_task == (thread_descriptor_address
672 read_memory (thread_descriptor_address + v_init_offset, &init, 1);
687 gdb::optional<fpu_state> fp_state;
693 for (
int i = low_reg; i < high_reg; ++i)
695 bool use_beneath =
false;
698 if (!fp_state.has_value ())
707 use_beneath = is_active;
733 gdb::optional<fpu_state> fp_state;
739 for (
int i = low_reg; i < high_reg; ++i)
741 bool use_beneath =
false;
744 if (!fp_state.has_value ())
753 use_beneath = is_active;
855 const gdb_byte *writebuf,
856 ULONGEST offset, ULONGEST len,
857 ULONGEST *xfered_len)
859 scoped_restore save_ptid = make_scoped_restore (&
inferior_ptid);
866 offset, len, xfered_len);
884 warning (_(
"%s. Task/thread support disabled."), err_msg);
914Support for Ravenscar task/thread switching is enabled\n"));
917Support for Ravenscar task/thread switching is disabled\n"));
934 _(
"Prefix command for changing Ravenscar-specific settings."),
935 _(
"Prefix command for showing Ravenscar-specific settings."),
941Enable or disable support for GNAT Ravenscar tasks."), _(
"\
942Show whether support for GNAT Ravenscar tasks is enabled."),
944Enable or disable support for task/thread switching with the GNAT\n\
945Ravenscar run-time library for bareboard configuration."),
struct ada_task_info * ada_get_task_info_from_ptid(ptid_t ptid)
const char * ada_get_tcb_types_info(void)
void iterate_over_live_ada_tasks(ada_task_list_iterator_ftype iterator)
struct gdbarch * target_gdbarch(void)
int unpush_target(struct target_ops *t)
thread_info * find_thread(ptid_t ptid)
void raw_collect(int regnum, void *buf) const override
void raw_supply(int regnum, const void *buf) override
void set_ptid(const ptid_t ptid)
struct regcache * m_regcache
~temporarily_change_regcache_ptid()
temporarily_change_regcache_ptid(struct regcache *regcache, ptid_t new_ptid)
struct cmd_list_element * showlist
struct cmd_list_element * setlist
set_show_commands add_setshow_prefix_cmd(const char *name, command_class theclass, const char *set_doc, const char *show_doc, cmd_list_element **set_subcommands_list, cmd_list_element **show_subcommands_list, cmd_list_element **set_list, cmd_list_element **show_list)
set_show_commands add_setshow_boolean_cmd(const char *name, enum command_class theclass, bool *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
void write_memory(CORE_ADDR memaddr, const bfd_byte *myaddr, ssize_t len)
void read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
CORE_ADDR extract_typed_address(const gdb_byte *buf, struct type *type)
int gdbarch_num_regs(struct gdbarch *gdbarch)
int gdbarch_sp_regnum(struct gdbarch *gdbarch)
struct ravenscar_arch_ops * gdbarch_ravenscar_ops(struct gdbarch *gdbarch)
void switch_to_thread(struct thread_info *thr)
struct type * lookup_pointer_type(struct type *type)
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
struct inferior * current_inferior(void)
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
struct bound_minimal_symbol lookup_minimal_symbol(const char *, const char *, struct objfile *)
observable< inferior * > inferior_created
static process_stratum_target * as_process_stratum_target(target_ops *target)
static void show_ravenscar_task_switching_command(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
static bool ravenscar_task_support
static bool has_ravenscar_runtime()
static const target_info ravenscar_target_info
void _initialize_ravenscar()
static void ravenscar_inferior_created(inferior *inf)
static struct cmd_list_element * set_ravenscar_list
static const char first_task_name[]
static bool is_ravenscar_task(ptid_t ptid)
static CORE_ADDR get_running_thread_id(int cpu)
static const char running_thread_name[]
static struct bound_minimal_symbol get_running_thread_msymbol()
static const char ravenscar_runtime_initializer[]
static const char known_tasks_name[]
static struct cmd_list_element * show_ravenscar_list
int register_size(struct gdbarch *gdbarch, int regnum)
enum register_status regcache_cooked_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
CORE_ADDR value_address() const
struct minimal_symbol * minsym
struct type * builtin_data_ptr
bool on_demand_fp() const
const int first_stack_register
void supply_one_register(struct regcache *regcache, int regnum, CORE_ADDR descriptor, CORE_ADDR stack_base) const
const gdb::array_view< const int > offsets
bool is_fp_register(int regnum) const
void store_one_register(struct regcache *regcache, int regnum, CORE_ADDR descriptor, CORE_ADDR stack_base) const
CORE_ADDR get_stack_base(struct regcache *) const
int get_fpu_context_offset() const
const int last_stack_register
int get_v_init_offset() const
void fetch_register(struct regcache *recache, int regnum) const
void store_register(struct regcache *recache, int regnum) const
void set_base_thread_from_ravenscar_task(ptid_t ptid)
void prepare_to_store(struct regcache *) override
void mourn_inferior() override
std::unordered_map< ULONGEST, int > m_cpu_map
bool task_is_currently_active(ptid_t ptid)
enum target_xfer_status xfer_partial(enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) override
std::string pid_to_str(ptid_t) override
strata stratum() const override
fpu_state get_fpu_state(struct regcache *regcache, const ravenscar_arch_ops *arch_ops)
bool stopped_by_sw_breakpoint() override
ptid_t active_task(int cpu)
ptid_t wait(ptid_t, struct target_waitstatus *, target_wait_flags) override
void resume(ptid_t, int, enum gdb_signal) override
bool stopped_by_hw_breakpoint() override
ptid_t get_ada_task_ptid(long lwp, ULONGEST thread) override
int get_thread_base_cpu(ptid_t ptid)
void add_thread(struct ada_task_info *task)
ptid_t get_base_thread_from_ravenscar_task(ptid_t ptid)
void store_registers(struct regcache *, int) override
thread_info * add_active_thread()
ravenscar_thread_target()
bool stopped_data_address(CORE_ADDR *) override
void fetch_registers(struct regcache *, int) override
void update_thread_list() override
int core_of_thread(ptid_t ptid) override
bool runtime_initialized()
bool stopped_by_watchpoint() override
const target_info & info() const override
struct btrace_target_info * enable_btrace(thread_info *tp, const struct btrace_config *conf) override
bool thread_alive(ptid_t ptid) override
virtual ptid_t wait(ptid_t, struct target_waitstatus *, target_wait_flags options) TARGET_DEFAULT_FUNC(default_target_wait)
virtual int core_of_thread(ptid_t ptid) TARGET_DEFAULT_RETURN(-1)
virtual std::string pid_to_str(ptid_t) TARGET_DEFAULT_FUNC(default_pid_to_str)
virtual void fetch_registers(struct regcache *, int) TARGET_DEFAULT_IGNORE()
virtual bool stopped_by_sw_breakpoint() TARGET_DEFAULT_RETURN(false)
virtual bool stopped_by_watchpoint() TARGET_DEFAULT_RETURN(false)
target_ops * beneath() const
virtual bool stopped_data_address(CORE_ADDR *) TARGET_DEFAULT_RETURN(false)
virtual struct btrace_target_info * enable_btrace(thread_info *tp, const struct btrace_config *conf) TARGET_DEFAULT_NORETURN(tcomplain())
virtual void store_registers(struct regcache *, int) TARGET_DEFAULT_NORETURN(noprocess())
virtual enum target_xfer_status xfer_partial(enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) TARGET_DEFAULT_RETURN(TARGET_XFER_E_IO)
virtual bool stopped_by_hw_breakpoint() TARGET_DEFAULT_RETURN(false)
virtual void resume(ptid_t, int TARGET_DEBUG_PRINTER(target_debug_print_step), enum gdb_signal) TARGET_DEFAULT_NORETURN(noprocess())
virtual void prepare_to_store(struct regcache *) TARGET_DEFAULT_NORETURN(noprocess())
virtual void mourn_inferior() TARGET_DEFAULT_FUNC(default_mourn_inferior)
std::unique_ptr< target_ops, target_ops_deleter > target_ops_up
void gdb_printf(struct ui_file *stream, const char *format,...)
struct value * value_ptradd(struct value *arg1, LONGEST arg2)
struct value * value_ind(struct value *arg1)
LONGEST value_as_long(struct value *val)
struct value * value_from_pointer(struct type *type, CORE_ADDR addr)
@ TARGET_WAITKIND_SIGNALLED