This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils 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]

Re: [PATCH 2/5] sparc: support for the check_object_attribute ebl hook.


    On Mon, Oct 05, 2015 at 05:36:31PM +0200, Jose E. Marchesi wrote:
    > This makes elfutils based utilities to be aware of the ELF attribute
    > tags defined in sparc targets.
    
    Are the hwcap values specified somewhere?
    If so it would be good to add an URL to the specification.

No, the hardware capabilities are not currently documented in the psABI
(this will change soon tho).

    > +bool
    > +sparc_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
    > +			      const char *vendor, int tag, uint64_t value,
    > +			      const char **tag_name, const char **value_name)
    > +{
    > +  if (!strcmp (vendor, "gnu"))
    > +    switch (tag)
    > +      {
    > +      case 4:
    > +	*tag_name = "GNU_Sparc_HWCAPS";
    > +	static const char *hwcaps[32] =
    > +	  {
    > +	    "mul32", "div32", "fsmuld", "v8plus", "popc", "vis", "vis2",
    > +	    "asi_blk_init", "fmaf", NULL, "vis3", "hpc", "random", "trans", "fjfmau",
    > +	    "ima", "asi_cache_sparing", "aes", "des", "kasumi", "camellia",
    > +	    "md5", "sha1", "sha256", "sha512", "mpmul", "mont", "pause",
    > +	    "cbcond", "crc32c", NULL, NULL
    > +	  };
    > +	if (value < 32 && hwcaps[value] != NULL)
    > +	  *value_name = hwcaps[value];
    > +	return true;
    > +
    > +      case 8:
    > +	*tag_name = "GNU_Sparc_HWCAPS2";
    > +	static const char *hwcaps2[32] =
    > +	  {
    > +	    "fjathplus", "vis3b", "adp", "sparc5", "mwait", "xmpmul",
    > +	    "xmont", "nsec", "fjathhpc", "fjdes", "fjaes"
    > +	  };
    > +	if (value < 32 && hwcaps2[value] != NULL)
    > +	  *value_name = hwcaps2[value];
    > +	return true;
    > +      }
    > +
    > +  return false;
    > +}
    
    I assume only values 0-31 are valid, even if there isn't currently any
    name specified. It would be slightly more efficient to only define the
    actually used values so we don't have these large empty arrays.

Only the values with names associated are valid.  In the amended patch
below the arrays are packed to not waste space.  Note however the
isolated NULL in the first array.  It corresponds to an unused bit in
AT_HWCAP.

commit 7ad347d264b280507caae3d8b8f171acf7a5c0a9
Author: Jose E. Marchesi <jose.marchesi@oracle.com>
Date:   Tue Oct 6 14:10:53 2015 +0200

    sparc: support for the check_object_attribute ebl hook.
    
    This makes elfutils based utilities to be aware of the ELF attribute
    tags defined in sparc targets.
    
    Signed-off-by: Jose E. Marchesi <jose.marchesi@oracle.com>

diff --git a/backends/ChangeLog b/backends/ChangeLog
index 60c6b72..791b9db 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,9 @@
+2015-10-06  Jose E. Marchesi  <jose.marchesi@oracle.com>
+
+	* sparc_attrs.c: New file.
+	* Makefile.am (sparc_SRCS): Added sparc_attrs.c
+	* sparc_init.c (sparc_init): Hook sparc_check_object_attribute.
+
 2015-10-02  Jose E. Marchesi  <jose.marchesi@oracle.com>
 
 	* sparc_init.c (RELOC_TYPE_ID): Defined.
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 21d7bd2..cefe5eb 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -84,7 +84,7 @@ libebl_aarch64_pic_a_SOURCES = $(aarch64_SRCS)
 am_libebl_aarch64_pic_a_OBJECTS = $(aarch64_SRCS:.c=.os)
 
 sparc_SRCS = sparc_init.c sparc_symbol.c sparc_regs.c sparc_retval.c \
-	     sparc_corenote.c sparc64_corenote.c sparc_auxv.c
+	     sparc_corenote.c sparc64_corenote.c sparc_auxv.c sparc_attrs.c
 libebl_sparc_pic_a_SOURCES = $(sparc_SRCS)
 am_libebl_sparc_pic_a_OBJECTS = $(sparc_SRCS:.c=.os)
 
diff --git a/backends/sparc_attrs.c b/backends/sparc_attrs.c
new file mode 100644
index 0000000..e95b577
--- /dev/null
+++ b/backends/sparc_attrs.c
@@ -0,0 +1,75 @@
+/* Object attribute tags for SPARC.
+   Copyright (C) 2015 Oracle, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <dwarf.h>
+
+#define BACKEND sparc_
+#include "libebl_CPU.h"
+
+bool
+sparc_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
+			      const char *vendor, int tag, uint64_t value,
+			      const char **tag_name, const char **value_name)
+{
+  if (!strcmp (vendor, "gnu"))
+    switch (tag)
+      {
+      case 4:
+	*tag_name = "GNU_Sparc_HWCAPS";
+	static const char *hwcaps[30] =
+	  {
+	    "mul32", "div32", "fsmuld", "v8plus", "popc", "vis", "vis2",
+	    "asi_blk_init", "fmaf", NULL, "vis3", "hpc", "random", "trans", "fjfmau",
+	    "ima", "asi_cache_sparing", "aes", "des", "kasumi", "camellia",
+	    "md5", "sha1", "sha256", "sha512", "mpmul", "mont", "pause",
+	    "cbcond", "crc32c"
+	  };
+	if (value < 30 && hwcaps[value] != NULL)
+	  *value_name = hwcaps[value];
+	return true;
+
+      case 8:
+	*tag_name = "GNU_Sparc_HWCAPS2";
+	static const char *hwcaps2[11] =
+	  {
+	    "fjathplus", "vis3b", "adp", "sparc5", "mwait", "xmpmul",
+	    "xmont", "nsec", "fjathhpc", "fjdes", "fjaes"
+	  };
+	if (value < 11)
+	  *value_name = hwcaps2[value];
+	return true;
+      }
+
+  return false;
+}
+
diff --git a/backends/sparc_init.c b/backends/sparc_init.c
index 229a9b0..f8a7cfb 100644
--- a/backends/sparc_init.c
+++ b/backends/sparc_init.c
@@ -75,6 +75,7 @@ sparc_init (Elf *elf __attribute__ ((unused)),
   HOOK (eh, auxv_info);
   HOOK (eh, register_info);
   HOOK (eh, return_value_location);
+  HOOK (eh, check_object_attribute);
 
   return MODVERSION;
 }


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