Hi Steve,

On Fri, Jun 14, 2024 at 03:47:19PM +0100, Steve Capper wrote:
> We need to read the PAC mask from a core file when debugging offline
> as the information is still needed to demangle return addresses.
> 
> This commit pulls out the NT_ARM_PAC_MASK info from the core and feeds
> it through to dwfl_thread_state_aarch64_pauth for each thread.

Sorry, I was on vacation and started reviewing patches posted while I
was away. Should have started at the other end of the queue.

This patch partially overlaps with:
https://patchwork.sourceware.org/project/elfutils/patch/20240814085134.109500-3-kuan-ying....@canonical.com/

Luckily the patches agree on the definition of the the pac_items
(modulo the name data_mask/insn_mask vs pauth_dmask/pauth_cmask).

This patch doesn't introduce a regset for ARM_PAC_ENABLED_KEYS that
the other one does. Is this not necessary?

Thanks,

Mark

> Signed-off-by: Steve Capper <steve.cap...@arm.com>
> ---
>  backends/aarch64_corenote.c | 15 ++++++++++++++-
>  libdwfl/linux-core-attach.c | 34 ++++++++++++++++++++++++++++++++++
>  2 files changed, 48 insertions(+), 1 deletion(-)
> 
> diff --git a/backends/aarch64_corenote.c b/backends/aarch64_corenote.c
> index 905a4b8a..f612d2ce 100644
> --- a/backends/aarch64_corenote.c
> +++ b/backends/aarch64_corenote.c
> @@ -107,6 +107,18 @@ static const Ebl_Core_Item aarch64_syscall_items [] =
>      }
>    };
>  
> +static const Ebl_Core_Item aarch64_pac_items [] =
> +  {
> +    {
> +      .name = "data_mask", .type = ELF_T_XWORD, .format = 'x',
> +      .offset = 0, .group = "register"
> +    },
> +    {
> +      .name = "insn_mask", .type = ELF_T_XWORD, .format = 'x',
> +      .offset = 8, .group = "register"
> +    }
> +  };
> +
>  #define AARCH64_HWBP_REG(KIND, N)                                    \
>      {                                                                        
> \
>        .name = "DBG" KIND "VR" #N "_EL1", .type = ELF_T_XWORD, .format = 'x', 
> \
> @@ -167,6 +179,7 @@ AARCH64_BP_WP_GROUP ("W", aarch64_hw_wp_items);
>    EXTRA_ITEMS (NT_ARM_TLS, 8, aarch64_tls_items)                     \
>    EXTRA_ITEMS (NT_ARM_HW_BREAK, 264, aarch64_hw_bp_items)            \
>    EXTRA_ITEMS (NT_ARM_HW_WATCH, 264, aarch64_hw_wp_items)            \
> -  EXTRA_ITEMS (NT_ARM_SYSTEM_CALL, 4, aarch64_syscall_items)
> +  EXTRA_ITEMS (NT_ARM_SYSTEM_CALL, 4, aarch64_syscall_items)         \
> +  EXTRA_ITEMS (NT_ARM_PAC_MASK, 16, aarch64_pac_items)
>  
>  #include "linux-core-note.c"
> diff --git a/libdwfl/linux-core-attach.c b/libdwfl/linux-core-attach.c
> index d6f9e971..91a5461a 100644
> --- a/libdwfl/linux-core-attach.c
> +++ b/libdwfl/linux-core-attach.c
> @@ -289,6 +289,40 @@ core_set_initial_registers (Dwfl_Thread *thread, void 
> *thread_arg_voidp)
>         reg_desc += regloc->pad;
>       }
>      }
> +
> +  /* look for any Pointer Authentication code masks on AArch64 machines */
> +  GElf_Ehdr ehdr_mem;
> +  GElf_Ehdr *ehdr = gelf_getehdr(core, &ehdr_mem);
> +  if (ehdr && ehdr->e_machine == EM_AARCH64)
> +  {
> +    while (offset < note_data->d_size
> +           && (offset = gelf_getnote (note_data, offset,
> +                                 &nhdr, &name_offset, &desc_offset)) > 0)
> +    {
> +      if (nhdr.n_type != NT_ARM_PAC_MASK)
> +        continue;
> +
> +      name = (nhdr.n_namesz == 0 ? "" : note_data->d_buf + name_offset);
> +      desc = note_data->d_buf + desc_offset;
> +      core_note_err = ebl_core_note (core_arg->ebl, &nhdr, name, desc,
> +                                &regs_offset, &nregloc, &reglocs,
> +                                &nitems, &items);
> +      if (!core_note_err)
> +        break;
> +
> +      for (item = items; item < items + nitems; item++)
> +        if (strcmp(item->name, "insn_mask") == 0)
> +          break;
> +
> +      if (item == items + nitems)
> +        continue;
> +
> +      uint64_t insn_mask = read_8ubyte_unaligned_noncvt(desc + item->offset);
> +      dwfl_thread_state_aarch64_pauth(thread, insn_mask);
> +      break;
> +    }
> +  }
> +
>    return true;
>  }
>  
> -- 
> 2.39.2
> 

Reply via email to