diff options
Diffstat (limited to 'scripts/gdb/linux/cpus.py')
| -rw-r--r-- | scripts/gdb/linux/cpus.py | 23 | 
1 files changed, 21 insertions, 2 deletions
| diff --git a/scripts/gdb/linux/cpus.py b/scripts/gdb/linux/cpus.py index 008e62f3190d..15fc4626d236 100644 --- a/scripts/gdb/linux/cpus.py +++ b/scripts/gdb/linux/cpus.py @@ -16,6 +16,9 @@ import gdb  from linux import tasks, utils +task_type = utils.CachedType("struct task_struct") + +  MAX_CPUS = 4096 @@ -156,6 +159,23 @@ Note that VAR has to be quoted as string."""  PerCpu() +def get_current_task(cpu): +    task_ptr_type = task_type.get_type().pointer() + +    if utils.is_target_arch("x86"): +         var_ptr = gdb.parse_and_eval("¤t_task") +         return per_cpu(var_ptr, cpu).dereference() +    elif utils.is_target_arch("aarch64"): +         current_task_addr = gdb.parse_and_eval("$SP_EL0") +         if((current_task_addr >> 63) != 0): +             current_task = current_task_addr.cast(task_ptr_type) +             return current_task.dereference() +         else: +             raise gdb.GdbError("Sorry, obtaining the current task is not allowed " +                                "while running in userspace(EL0)") +    else: +        raise gdb.GdbError("Sorry, obtaining the current task is not yet " +                           "supported with this arch")  class LxCurrentFunc(gdb.Function):      """Return current task. @@ -167,8 +187,7 @@ number. If CPU is omitted, the CPU of the current context is used."""          super(LxCurrentFunc, self).__init__("lx_current")      def invoke(self, cpu=-1): -        var_ptr = gdb.parse_and_eval("¤t_task") -        return per_cpu(var_ptr, cpu).dereference() +        return get_current_task(cpu)  LxCurrentFunc() | 
