aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/ada-lang.h6
-rw-r--r--gdb/ada-tasks.c10
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);