Add back end code for interpreting NT_ARM_VFP core note.
authorPetr Machata <pmachata@redhat.com>
Mon, 24 Sep 2012 23:37:20 +0000 (01:37 +0200)
committerPetr Machata <pmachata@redhat.com>
Mon, 24 Sep 2012 23:37:20 +0000 (01:37 +0200)
Signed-off-by: Petr Machata <pmachata@redhat.com>
backends/ChangeLog
backends/arm_corenote.c
backends/linux-core-note.c

index 74c68d4..1842daa 100644 (file)
@@ -1,3 +1,9 @@
+2012-09-24  Petr Machata  <pmachata@redhat.com>
+
+       * arm_corenote.c (vfp_items, vfp_regs): New const variables.
+       (EXTRA_NOTES): Use it for NT_ARM_VFP.
+       * linux-core-note.c (EXTRA_REGSET_ITEMS): New macro.
+
 2012-09-17  Petr Machata  <pmachata@redhat.com>
 
        * arm_corenote.c (FPREGSET_SIZE): Change to 116.
index 1bc98cc..d527944 100644 (file)
@@ -1,5 +1,5 @@
 /* ARM specific core note handling.
-   Copyright (C) 2009 Red Hat, Inc.
+   Copyright (C) 2009, 2012 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -73,4 +73,22 @@ static const Ebl_Register_Location fpregset_regs[] =
 #define TYPE_UID_T             ELF_T_HALF
 #define TYPE_GID_T             ELF_T_HALF
 
+#define ARM_VFPREGS_SIZE ( 32 * 8 /*fpregs*/ + 4 /*fpscr*/ )
+static const Ebl_Register_Location vfp_regs[] =
+  {
+    { .offset = 0, .regno = 256, .count = 32, .bits = 64 }, /* fpregs */
+  };
+
+static const Ebl_Core_Item vfp_items[] =
+  {
+    {
+      .name = "fpscr", .group = "register",
+      .offset = 0,
+      .count = 0, .type = ELF_T_WORD, .format = 'x',
+    },
+  };
+
+#define        EXTRA_NOTES \
+  EXTRA_REGSET_ITEMS (NT_ARM_VFP, ARM_VFPREGS_SIZE, vfp_regs, vfp_items)
+
 #include "linux-core-note.c"
index be27468..1592694 100644 (file)
@@ -252,6 +252,17 @@ EBLHOOK(core_note) (nhdr, name, regs_offset, nregloc, reglocs, nitems, items)
       *items = NULL;                                                         \
       return 1;
 
+#define EXTRA_REGSET_ITEMS(type, size, table, extra_items)                   \
+    case type:                                                               \
+      if (nhdr->n_descsz != size)                                            \
+       return 0;                                                             \
+      *regs_offset = 0;                                                              \
+      *nregloc = sizeof table / sizeof table[0];                             \
+      *reglocs = table;                                                              \
+      *nitems = sizeof extra_items / sizeof extra_items[0];                  \
+      *items = extra_items;                                                  \
+      return 1;
+
 #ifdef FPREGSET_SIZE
     EXTRA_REGSET (NT_FPREGSET, FPREGSET_SIZE, fpregset_regs)
 #endif