This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Provide the "Base CPU" in output of "info task" (if set by runtime).


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=65d40437e2704e635e7144319e956edf3e7fa026

commit 65d40437e2704e635e7144319e956edf3e7fa026
Author: Joel Brobecker <brobecker@adacore.com>
Date:   Tue Nov 21 13:58:00 2017 -0800

    Provide the "Base CPU" in output of "info task" (if set by runtime).
    
    At the user level, this patch enhances the debugger to print the ID
    of the base CPU a task is running on:
    
            (gdb) info task 3
            Ada Task: 0x13268
            Name: raven1
            Thread: 0x13280
            LWP: 0
     !!!->  Base CPU: 1
            No parent
            Base Priority: 127
            State: Runnable
    
    This new field is only printed when the base CPU is nonzero or, in
    other words, if the base CPU info is being provided by the runtime.
    For instance, on native systems, where threads/processes can "jump"
    from CPU to CPU, the info is not available, and the output of the
    command above then remains unchanged.
    
    At the internal level, the real purpose of this change is to prepare
    the way for ravenscar-thread to start handling SMP systems. For that,
    we'll need to know which CPU each task is running on...  More info
    on that in the commit that actually adds support for it.
    
    gdb/ChangeLog:
    
            * 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.

Diff:
---
 gdb/ChangeLog   |  8 ++++++++
 gdb/ada-lang.h  |  6 ++++++
 gdb/ada-tasks.c | 10 ++++++++++
 3 files changed, 24 insertions(+)

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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]