diff options
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/ada-lang.h | 6 | ||||
-rw-r--r-- | gdb/ada-tasks.c | 10 |
3 files changed, 24 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5bef537..7300cdd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2017-11-21 Joel Brobecker <brobecker@adacore.com> + * ada-lang.h (struct ada_task_info) <base_cpu>: New field. + * ada-lang.c (struct atcb_fieldno) <base_cpu>: New field. + (get_tcb_types_info): Set fieldnos.base_cpu. + (read_atcb): Set task_info->base_cpu. + (info_task): Print "Base CPU" info if set by runtime. + +2017-11-21 Joel Brobecker <brobecker@adacore.com> + * ravenscar-thread.c (ravenscar_stopped_by_sw_breakpoint) (ravenscar_stopped_by_hw_breakpoint, ravenscar_stopped_by_watchpoint) (ravenscar_stopped_data_address, ravenscar_core_of_thread): diff --git a/gdb/ada-lang.h b/gdb/ada-lang.h index d15fbbd..c11fb48 100644 --- a/gdb/ada-lang.h +++ b/gdb/ada-lang.h @@ -141,6 +141,12 @@ struct ada_task_info /* If the task is accepting a rendezvous with another task, this field contains the ID of the calling task. Zero otherwise. */ CORE_ADDR caller_task; + + /* The CPU on which the task is running. This is dependent on + the runtime actually providing that info, which is not always + the case. Normally, we should be able to count on it on + bare-metal targets. */ + int base_cpu; }; /* Assuming V points to an array of S objects, make sure that it contains at diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index 1d5542d..e29b563 100644 --- a/gdb/ada-tasks.c +++ b/gdb/ada-tasks.c @@ -123,6 +123,7 @@ struct atcb_fieldnos int activation_link; int call; int ll; + int base_cpu; /* Fields in Task_Primitives.Private_Data. */ int ll_thread; @@ -535,6 +536,7 @@ get_tcb_types_info (void) "activation_link", 1); fieldnos.call = ada_get_field_index (common_type, "call", 1); fieldnos.ll = ada_get_field_index (common_type, "ll", 0); + fieldnos.base_cpu = ada_get_field_index (common_type, "base_cpu", 0); fieldnos.ll_thread = ada_get_field_index (ll_type, "thread", 0); fieldnos.ll_lwp = ada_get_field_index (ll_type, "lwp", 1); fieldnos.call_self = ada_get_field_index (call_type, "self", 0); @@ -748,6 +750,10 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info) } } + task_info->base_cpu + = value_as_long (value_field (common_value, + pspace_data->atcb_fieldno.base_cpu)); + /* And finally, compute the task ptid. Note that there are situations where this cannot be determined: - The task is no longer alive - the ptid is irrelevant; @@ -1179,6 +1185,10 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf) printf_filtered (_("Thread: %#lx\n"), ptid_get_tid (task_info->ptid)); printf_filtered (_("LWP: %#lx\n"), ptid_get_lwp (task_info->ptid)); + /* If set, print the base CPU. */ + if (task_info->base_cpu != 0) + printf_filtered (_("Base CPU: %d\n"), task_info->base_cpu); + /* Print who is the parent (if any). */ if (task_info->parent != 0) parent_taskno = get_task_number_from_id (task_info->parent, inf); |