public inbox for elfutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH V4 1/1] Add backend support for C-SKY
  2019-07-16 11:16 [PATCH V4 0/1] Add C-SKY support Mao Han
@ 2019-07-16 11:16 ` Mao Han
  2019-07-16 13:48 ` [PATCH V4 0/1] Add C-SKY support Mark Wielaard
  1 sibling, 0 replies; 5+ messages in thread
From: Mao Han @ 2019-07-16 11:16 UTC (permalink / raw)
  To: mark; +Cc: elfutils-devel, Mao Han

C-SKY V2 ABI manual:
https://github.com/c-sky/csky-doc/blob/master/C-SKY_V2_CPU_Applications_Binary_Interface_Standards_Manual.pdf
C-SKY architecture user guide:
https://github.com/c-sky/csky-doc/blob/master/CSKY%20Architecture%20user_guide.pdf

Signed-off-by: Mao Han <han_mao@c-sky.com>
---
 backends/ChangeLog       |  12 ++++++
 backends/Makefile.am     |   9 ++++-
 backends/csky_attrs.c    |  67 +++++++++++++++++++++++++++++++
 backends/csky_cfi.c      |  60 ++++++++++++++++++++++++++++
 backends/csky_corenote.c |  61 ++++++++++++++++++++++++++++
 backends/csky_init.c     |  65 ++++++++++++++++++++++++++++++
 backends/csky_initreg.c  |  87 ++++++++++++++++++++++++++++++++++++++++
 backends/csky_regs.c     | 101 +++++++++++++++++++++++++++++++++++++++++++++++
 backends/csky_reloc.def  |  86 ++++++++++++++++++++++++++++++++++++++++
 backends/csky_symbol.c   |  77 ++++++++++++++++++++++++++++++++++++
 libebl/ChangeLog         |   4 ++
 libebl/eblopenbackend.c  |   1 +
 src/ChangeLog            |   4 ++
 src/elflint.c            |   2 +-
 src/readelf.c            |   4 +-
 tests/ChangeLog          |   7 ++++
 tests/hello_csky.ko.bz2  | Bin 0 -> 26448 bytes
 tests/run-addrcfi.sh     |  43 ++++++++++++++++++++
 tests/run-strip-reloc.sh |   3 +-
 tests/testfilecsky.bz2   | Bin 0 -> 3145 bytes
 20 files changed, 688 insertions(+), 5 deletions(-)
 create mode 100644 backends/csky_attrs.c
 create mode 100644 backends/csky_cfi.c
 create mode 100644 backends/csky_corenote.c
 create mode 100644 backends/csky_init.c
 create mode 100644 backends/csky_initreg.c
 create mode 100644 backends/csky_regs.c
 create mode 100644 backends/csky_reloc.def
 create mode 100644 backends/csky_symbol.c
 create mode 100644 tests/hello_csky.ko.bz2
 create mode 100644 tests/testfilecsky.bz2

diff --git a/backends/ChangeLog b/backends/ChangeLog
index af1a40e..f1eaf14 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,15 @@
+2019-07-13 Mao Han <han_mao@c-sky.com>
+
+	* Makefile.am: Add C-SKY.
+	* csky_attrs.c: New file.
+	* csky_cfi.c: New file.
+	* csky_corenote.c: Likewise.
+	* csky_init.c: Likewise.
+	* csky_initreg.c: Likewise.
+	* csky_regs.c: Likewise.
+	* csky_reloc.def: Likewise.
+	* csky_symbol.c: Likewise.
+
 2019-06-28  Mark Wielaard  <mark@klomp.org>
 
 	* aarch64_init.c (aarch64_init.c): Remove eh->name;
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 2126a2e..175468f 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -33,12 +33,13 @@ AM_CPPFLAGS += -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \
 
 
 modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \
-	  tilegx m68k bpf riscv
+	  tilegx m68k bpf riscv csky
 libebl_pic = libebl_i386_pic.a libebl_sh_pic.a libebl_x86_64_pic.a    \
 	     libebl_ia64_pic.a libebl_alpha_pic.a libebl_arm_pic.a    \
 	     libebl_aarch64_pic.a libebl_sparc_pic.a libebl_ppc_pic.a \
 	     libebl_ppc64_pic.a libebl_s390_pic.a libebl_tilegx_pic.a \
-	     libebl_m68k_pic.a libebl_bpf_pic.a libebl_riscv_pic.a
+	     libebl_m68k_pic.a libebl_bpf_pic.a libebl_riscv_pic.a    \
+	     libebl_csky_pic.a
 noinst_LIBRARIES = $(libebl_pic)
 noinst_DATA = $(libebl_pic:_pic.a=.so)
 
@@ -136,6 +137,10 @@ riscv_SRCS = riscv_init.c riscv_symbol.c riscv_cfi.c riscv_regs.c \
 libebl_riscv_pic_a_SOURCES = $(riscv_SRCS)
 am_libebl_riscv_pic_a_OBJECTS = $(riscv_SRCS:.c=.os)
 
+csky_SRCS = csky_attrs.c csky_init.c csky_symbol.c csky_cfi.c \
+	    csky_regs.c csky_initreg.c csky_corenote.c
+libebl_csky_pic_a_SOURCES = $(csky_SRCS)
+am_libebl_csky_pic_a_OBJECTS = $(csky_SRCS:.c=.os)
 
 libebl_%.so libebl_%.map: libebl_%_pic.a $(libelf) $(libdw) $(libeu)
 	@rm -f $(@:.so=.map)
diff --git a/backends/csky_attrs.c b/backends/csky_attrs.c
new file mode 100644
index 0000000..9b236f1
--- /dev/null
+++ b/backends/csky_attrs.c
@@ -0,0 +1,67 @@
+/* C-SKY ABI-specified defaults for DWARF CFI.
+   Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
+   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 csky_
+#include "libebl_CPU.h"
+
+bool
+csky_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
+			    const char *vendor, int tag,
+			    uint64_t value __attribute__ ((unused)),
+			    const char **tag_name,
+			    const char **value_name __attribute__ ((unused)))
+{
+  if (!strcmp (vendor, "gnu"))
+    switch (tag)
+      {
+      case 4:
+	*tag_name = "CSKY_ARCH_NAME";
+	return true;
+
+      case 5:
+	*tag_name = "CSKY_CPU_NAME";
+	return true;
+
+      case 6:
+        *tag_name = "CSKY_ISA_FLAGS";
+        return true;
+
+      case 7:
+        *tag_name = "CSKY_ISA_EXT_FLAGS";
+        return true;
+      }
+
+  return false;
+}
diff --git a/backends/csky_cfi.c b/backends/csky_cfi.c
new file mode 100644
index 0000000..7277dbd
--- /dev/null
+++ b/backends/csky_cfi.c
@@ -0,0 +1,60 @@
+/* C-SKY ABI-specified defaults for DWARF CFI.
+   Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
+   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 <dwarf.h>
+
+#define BACKEND csky_
+#include "libebl_CPU.h"
+
+
+int
+csky_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info)
+{
+  static const uint8_t abi_cfi[] =
+    {
+      DW_CFA_def_cfa, ULEB128_7 (14), ULEB128_7 (0),
+      DW_CFA_val_offset, ULEB128_7 (14), ULEB128_7 (0),
+
+#define SV(n) DW_CFA_same_value, ULEB128_7 (n)
+      SV(4), SV (5), SV (6), SV (7), SV (8), SV (9),
+      SV(10), SV (11), SV (15), SV (16), SV (17)
+#undef SV
+    };
+
+  abi_info->initial_instructions = abi_cfi;
+  abi_info->initial_instructions_end = &abi_cfi[sizeof abi_cfi];
+  abi_info->data_alignment_factor = -4;
+
+  abi_info->return_address_register = 15; /* lr.  */
+
+  return 0;
+}
diff --git a/backends/csky_corenote.c b/backends/csky_corenote.c
new file mode 100644
index 0000000..a1479bd
--- /dev/null
+++ b/backends/csky_corenote.c
@@ -0,0 +1,61 @@
+/* C-SKY specific core note handling.
+   Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
+   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 <elf.h>
+#include <inttypes.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/time.h>
+
+#define BACKEND	csky_
+#include "libebl_CPU.h"
+
+#define	ULONG			uint32_t
+#define PID_T			int32_t
+#define	UID_T			uint32_t
+#define	GID_T			uint32_t
+#define ALIGN_ULONG		4
+#define ALIGN_PID_T		4
+#define ALIGN_UID_T		4
+#define ALIGN_GID_T		4
+#define TYPE_ULONG		ELF_T_WORD
+#define TYPE_PID_T		ELF_T_SWORD
+#define TYPE_UID_T		ELF_T_WORD
+#define TYPE_GID_T		ELF_T_WORD
+
+static const Ebl_Register_Location prstatus_regs[] =
+  {
+    { .offset = 0, .regno = 0, .count = 36, .bits = 32 } /* r0..r31 */
+  };
+#define PRSTATUS_REGS_SIZE	(36 * 4)
+
+#include "linux-core-note.c"
diff --git a/backends/csky_init.c b/backends/csky_init.c
new file mode 100644
index 0000000..b34a03a
--- /dev/null
+++ b/backends/csky_init.c
@@ -0,0 +1,65 @@
+/* Initialization of C-SKY specific backend library.
+   Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
+   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
+
+#define BACKEND		csky_
+#define RELOC_PREFIX	R_CKCORE_
+#include "libebl_CPU.h"
+
+/* This defines the common reloc hooks based on csky_reloc.def.  */
+#include "common-reloc.c"
+
+const char *
+csky_init (Elf *elf __attribute__ ((unused)),
+	   GElf_Half machine __attribute__ ((unused)),
+	   Ebl *eh,
+	   size_t ehlen)
+{
+  /* Check whether the Elf_BH object has a sufficent size.  */
+  if (ehlen < sizeof (Ebl))
+    return NULL;
+
+  /* We handle it.  */
+  csky_init_reloc (eh);
+  HOOK (eh, abi_cfi);
+  HOOK (eh, core_note);
+  HOOK (eh, check_object_attribute);
+  HOOK (eh, machine_flag_check);
+  HOOK (eh, reloc_simple_type);
+  HOOK (eh, register_info);
+  HOOK (eh, section_type_name);
+  HOOK (eh, set_initial_registers_tid);
+
+  /* gcc/config/ #define DWARF_FRAME_REGISTERS.  */
+  eh->frame_nregs = 38;
+
+  return MODVERSION;
+}
diff --git a/backends/csky_initreg.c b/backends/csky_initreg.c
new file mode 100644
index 0000000..81a0da3
--- /dev/null
+++ b/backends/csky_initreg.c
@@ -0,0 +1,87 @@
+/* Fetch live process registers from TID. C-SKY version.
+   Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
+   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 "system.h"
+#include <assert.h>
+#if defined __CSKY__ && defined __linux__
+# include <sys/uio.h>
+# include <sys/procfs.h>
+# include <sys/ptrace.h>
+#endif
+
+#define BACKEND csky_
+#include "libebl_CPU.h"
+
+bool
+csky_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
+			ebl_tid_registers_t *setfunc __attribute__ ((unused)),
+				void *arg __attribute__ ((unused)))
+{
+#if !defined __CSKY__ || !defined __linux__
+  return false;
+#else /* __CSKY__ */
+  struct pt_regs user_regs;
+  struct iovec iovec;
+  iovec.iov_base = &user_regs;
+  iovec.iov_len = sizeof (user_regs);
+  if (ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iovec) != 0)
+    return false;
+
+  Dwarf_Word dwarf_regs[38];
+
+  /* lr.  */
+  dwarf_regs[15] = user_regs.lr;
+  /* sp.  */
+  dwarf_regs[14] = user_regs.usp;
+  /* r0 ~ r13.  */
+  dwarf_regs[0] = user_regs.a0;
+  dwarf_regs[1] = user_regs.a1;
+  dwarf_regs[2] = user_regs.a2;
+  dwarf_regs[3] = user_regs.a3;
+  for (int i = 4; i < 14; i++)
+    dwarf_regs[i] = user_regs.regs[i - 4];
+  /* r ~ r13.  */
+  for (int i = 16; i < 31; i++)
+    dwarf_regs[i] = user_regs.exregs[i - 16];
+  /* tls.  */
+  dwarf_regs[31] = user_regs.tls;
+  /* hi.  */
+  dwarf_regs[36] = user_regs.rhi;
+  /* lo.  */
+  dwarf_regs[37] = user_regs.rlo;
+  /* pc.  */
+  dwarf_regs[32] = user_regs.pc;
+  setfunc (-1, 1, &dwarf_regs[32], arg);
+
+  return setfunc (0, 38, dwarf_regs, arg);
+#endif
+}
diff --git a/backends/csky_regs.c b/backends/csky_regs.c
new file mode 100644
index 0000000..6d45c04
--- /dev/null
+++ b/backends/csky_regs.c
@@ -0,0 +1,101 @@
+/* Register names and numbers for C-SKY DWARF.
+   Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
+   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 csky_
+#include "libebl_CPU.h"
+
+ssize_t
+csky_register_info (Ebl *ebl  __attribute__ ((unused)),
+		    int regno, char *name, size_t namelen,
+		    const char **prefix, const char **setname,
+		    int *bits, int *type)
+{
+  if (name == NULL)
+    return 38;
+
+  *prefix = "";
+  *bits = 32;
+  *type = DW_ATE_signed;
+  *setname = "integer";
+
+  switch (regno)
+    {
+    case 0 ... 9:
+      name[0] = 'r';
+      name[1] = regno + '0';
+      namelen = 2;
+      break;
+
+    case 10 ... 13:
+    case 16 ... 30:
+      name[0] = 'r';
+      name[1] = regno / 10 + '0';
+      name[2] = regno % 10 + '0';
+      namelen = 3;
+      break;
+
+    case 14:
+      stpcpy (name, "sp");
+      namelen = 2;
+      break;
+
+    case 15:
+      stpcpy (name, "lr");
+      namelen = 2;
+      break;
+
+    case 31:
+      stpcpy (name, "tls");
+      namelen = 3;
+      break;
+
+    case 36:
+      stpcpy (name, "hi");
+      namelen = 2;
+      break;
+
+    case 37:
+      stpcpy (name, "lo");
+      namelen = 2;
+      break;
+
+    default:
+      *setname = NULL;
+      return 0;
+    }
+
+  name[namelen++] = '\0';
+  return namelen;
+}
diff --git a/backends/csky_reloc.def b/backends/csky_reloc.def
new file mode 100644
index 0000000..1108f0c
--- /dev/null
+++ b/backends/csky_reloc.def
@@ -0,0 +1,86 @@
+/* List the relocation types for csky.  -*- C -*-
+   Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
+   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/>.  */
+
+/*	    NAME,		REL|EXEC|DYN	*/
+
+
+RELOC_TYPE (NONE,		REL|EXEC|DYN)
+RELOC_TYPE (ADDR32,		REL|EXEC|DYN)
+RELOC_TYPE (PCRELIMM8BY4,	REL)
+RELOC_TYPE (PCRELIMM11BY2,	REL)
+RELOC_TYPE (PCREL32,		REL|DYN)
+RELOC_TYPE (PCRELJSR_IMM11BY2,	REL)
+RELOC_TYPE (RELATIVE,		EXEC|DYN)
+RELOC_TYPE (COPY,		EXEC|DYN)
+RELOC_TYPE (GLOB_DAT,		EXEC|DYN)
+RELOC_TYPE (JUMP_SLOT,		EXEC|DYN)
+RELOC_TYPE (GOTOFF,		REL)
+RELOC_TYPE (GOTPC,		REL)
+RELOC_TYPE (GOT32,		REL)
+RELOC_TYPE (PLT32,		REL)
+RELOC_TYPE (ADDRGOT,		REL)
+RELOC_TYPE (ADDRPLT,		REL)
+RELOC_TYPE (PCREL_IMM26BY2,	REL)
+RELOC_TYPE (PCREL_IMM16BY2,	REL)
+RELOC_TYPE (PCREL_IMM16BY4,	REL)
+RELOC_TYPE (PCREL_IMM10BY2,	REL)
+RELOC_TYPE (PCREL_IMM10BY4,	REL)
+RELOC_TYPE (ADDR_HI16,		REL|DYN)
+RELOC_TYPE (ADDR_LO16,		REL|DYN)
+RELOC_TYPE (GOTPC_HI16,		REL)
+RELOC_TYPE (GOTPC_LO16,		REL)
+RELOC_TYPE (GOTOFF_HI16,	REL)
+RELOC_TYPE (GOTOFF_LO16,	REL)
+RELOC_TYPE (GOT12,		REL)
+RELOC_TYPE (GOT_HI16,		REL)
+RELOC_TYPE (GOT_LO16,		REL)
+RELOC_TYPE (PLT12,		REL)
+RELOC_TYPE (PLT_HI16,		REL)
+RELOC_TYPE (PLT_LO16,		REL)
+RELOC_TYPE (ADDRGOT_HI16,	REL)
+RELOC_TYPE (ADDRGOT_LO16,	REL)
+RELOC_TYPE (ADDRPLT_HI16,	REL)
+RELOC_TYPE (ADDRPLT_LO16,	REL)
+RELOC_TYPE (PCREL_JSR_IMM26BY2,	REL|DYN)
+RELOC_TYPE (TOFFSET_LO16,	REL)
+RELOC_TYPE (DOFFSET_LO16,	REL)
+RELOC_TYPE (PCREL_IMM18BY2,	REL)
+RELOC_TYPE (DOFFSET_IMM18,	REL)
+RELOC_TYPE (DOFFSET_IMM18BY2,	REL)
+RELOC_TYPE (DOFFSET_IMM18BY4,	REL)
+RELOC_TYPE (GOT_IMM18BY4,	REL)
+RELOC_TYPE (PLT_IMM18BY4,	REL)
+RELOC_TYPE (PCREL_IMM7BY4,	REL)
+RELOC_TYPE (TLS_LE32,		REL)
+RELOC_TYPE (TLS_IE32,		REL)
+RELOC_TYPE (TLS_GD32,		REL)
+RELOC_TYPE (TLS_LDM32,		REL)
+RELOC_TYPE (TLS_LDO32,		REL)
+RELOC_TYPE (TLS_DTPMOD32,	EXEC|DYN)
+RELOC_TYPE (TLS_DTPOFF32,	EXEC|DYN)
+RELOC_TYPE (TLS_TPOFF32,	EXEC|DYN)
diff --git a/backends/csky_symbol.c b/backends/csky_symbol.c
new file mode 100644
index 0000000..79b5bf9
--- /dev/null
+++ b/backends/csky_symbol.c
@@ -0,0 +1,77 @@
+/* C-SKY specific symbolic name handling.
+   Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
+   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 <assert.h>
+#include <elf.h>
+#include <stddef.h>
+#include <string.h>
+
+#define BACKEND csky_
+#include "libebl_CPU.h"
+
+/* Check for the simple reloc types.  */
+Elf_Type
+csky_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type,
+			int *addsub __attribute__ ((unused)))
+{
+  switch (type)
+    {
+    case R_CKCORE_ADDR32:
+      return ELF_T_WORD;
+    default:
+      return ELF_T_NUM;
+    }
+}
+
+bool
+csky_machine_flag_check (GElf_Word flags)
+{
+  switch (flags & EF_CSKY_ABIMASK)
+    {
+    case EF_CSKY_ABIV2:
+      return true;
+    case EF_CSKY_ABIV1:
+    default:
+      return false;
+    }
+}
+
+const char *
+csky_section_type_name (int type,
+		       char *buf __attribute__ ((unused)),
+		       size_t len __attribute__ ((unused)))
+{
+  if (type == SHT_CSKY_ATTRIBUTES)
+    return "CSKY_ATTRIBUTES";
+
+  return NULL;
+}
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
index e42cd34..bb91c15 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,7 @@
+2019-04-29 Mao Han <han_mao@c-sky.com>
+
+	* eblopenbackend.c: Add C-SKY.
+
 2019-06-28  Mark Wielaard  <mark@klomp.org>
 
 	* eblopenbackend.c (try_dlopen): Remove result->name check.
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index 9dd5195..01711f5 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -135,6 +135,7 @@ static const struct
   { "bpf", "elf_bpf", "bpf", 3, EM_BPF, 0, 0 },
   { "riscv", "elf_riscv", "riscv", 5, EM_RISCV, ELFCLASS64, ELFDATA2LSB },
   { "riscv", "elf_riscv", "riscv", 5, EM_RISCV, ELFCLASS32, ELFDATA2LSB },
+  { "csky", "elf_csky", "csky", 4, EM_CSKY, ELFCLASS32, ELFDATA2LSB },
 };
 #define nmachines (sizeof (machines) / sizeof (machines[0]))
 
diff --git a/src/ChangeLog b/src/ChangeLog
index 27812b0..911ad26 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2019-07-13 Mao Han <han_mao@c-sky.com>
+
+	* elflint.c: Add C-SKY.
+
 2019-06-28  Mark Wielaard  <mark@klomp.org>
 
 	* readelf.c (print_ehdr): Use dwelf_elf_e_machine_string instead of
diff --git a/src/elflint.c b/src/elflint.c
index 810c8bd..edb466d 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -330,7 +330,7 @@ static const int valid_e_machine[] =
     EM_CRIS, EM_JAVELIN, EM_FIREPATH, EM_ZSP, EM_MMIX, EM_HUANY, EM_PRISM,
     EM_AVR, EM_FR30, EM_D10V, EM_D30V, EM_V850, EM_M32R, EM_MN10300,
     EM_MN10200, EM_PJ, EM_OPENRISC, EM_ARC_A5, EM_XTENSA, EM_ALPHA,
-    EM_TILEGX, EM_TILEPRO, EM_AARCH64, EM_BPF, EM_RISCV
+    EM_TILEGX, EM_TILEPRO, EM_AARCH64, EM_BPF, EM_RISCV, EM_CSKY
   };
 #define nvalid_e_machine \
   (sizeof (valid_e_machine) / sizeof (valid_e_machine[0]))
diff --git a/src/readelf.c b/src/readelf.c
index cda7c93..2084fb1 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -3571,7 +3571,9 @@ print_attributes (Ebl *ebl, const GElf_Ehdr *ehdr)
 
       if (shdr == NULL || (shdr->sh_type != SHT_GNU_ATTRIBUTES
 			   && (shdr->sh_type != SHT_ARM_ATTRIBUTES
-			       || ehdr->e_machine != EM_ARM)))
+			       || ehdr->e_machine != EM_ARM)
+			   && (shdr->sh_type != SHT_CSKY_ATTRIBUTES
+			       || ehdr->e_machine != EM_CSKY)))
 	continue;
 
       printf (gettext ("\
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 8162185..05910ab 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,10 @@
+2019-07-16  Mao Han  <han_mao@c-sky.com>
+
+	* hello_csky.ko.bz2: New testfile.
+	* run-addrcfi.sh: Add C-SKY testfile.
+	* run-strip-reloc.sh: Likewise.
+	* testfilecsky.bz2: New testfile.
+
 2019-06-28  Mark Wielaard  <mark@klomp.org>
 
 	* Makefile.am (check_PROGRAMS): Add dwelf_elf_e_machine_string.
diff --git a/tests/hello_csky.ko.bz2 b/tests/hello_csky.ko.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..ed98c7f6717251116484a8ed967d9983868171b0
GIT binary patch
literal 26448
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
Rs2Tt9cO+AV2?CJ6f57~7&W8X1

literal 0
HcmV?d00001

diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh
index fd89d02..64fa24d 100755
--- a/tests/run-addrcfi.sh
+++ b/tests/run-addrcfi.sh
@@ -3747,3 +3747,46 @@ testrun_compare ${abs_builddir}/addrcfi -e testfile-x32 0x00400390 <<\EOF
 	control reg66 (%fsw): undefined
 handle_cfi no CFI (.debug_frame): no error
 EOF
+
+# EM_CSKY (function bar 0x8440)
+testfiles testfilecsky
+testrun_compare ${abs_builddir}/addrcfi -e testfilecsky 0x8440 <<\EOF
+dwarf_cfi_addrframe (.eh_frame): no matching address range
+.debug_frame has 0x8440 => [0x8440, 0x844a):
+	return address in reg15
+	CFA location expression: bregx(14)
+	integer reg0 (r0): undefined
+	integer reg1 (r1): undefined
+	integer reg2 (r2): undefined
+	integer reg3 (r3): undefined
+	integer reg4 (r4): same_value
+	integer reg5 (r5): same_value
+	integer reg6 (r6): same_value
+	integer reg7 (r7): same_value
+	integer reg8 (r8): same_value
+	integer reg9 (r9): same_value
+	integer reg10 (r10): same_value
+	integer reg11 (r11): same_value
+	integer reg12 (r12): undefined
+	integer reg13 (r13): undefined
+	integer reg14 (sp): location expression: call_frame_cfa stack_value
+	integer reg15 (lr): same_value
+	integer reg16 (r16): same_value
+	integer reg17 (r17): same_value
+	integer reg18 (r18): undefined
+	integer reg19 (r19): undefined
+	integer reg20 (r20): undefined
+	integer reg21 (r21): undefined
+	integer reg22 (r22): undefined
+	integer reg23 (r23): undefined
+	integer reg24 (r24): undefined
+	integer reg25 (r25): undefined
+	integer reg26 (r26): undefined
+	integer reg27 (r27): undefined
+	integer reg28 (r28): undefined
+	integer reg29 (r29): undefined
+	integer reg30 (r30): undefined
+	integer reg31 (tls): undefined
+	integer reg36 (hi): undefined
+	integer reg37 (lo): undefined
+EOF
diff --git a/tests/run-strip-reloc.sh b/tests/run-strip-reloc.sh
index 0c6b1c2..b7ec142 100755
--- a/tests/run-strip-reloc.sh
+++ b/tests/run-strip-reloc.sh
@@ -18,7 +18,7 @@
 . $srcdir/test-subr.sh
 
 testfiles hello_i386.ko hello_x86_64.ko hello_ppc64.ko hello_s390.ko \
-	hello_aarch64.ko hello_m68k.ko hello_riscv64.ko
+	hello_aarch64.ko hello_m68k.ko hello_riscv64.ko hello_csky.ko
 
 tempfiles readelf.out readelf.out1 readelf.out2
 tempfiles out.stripped1 out.debug1 out.stripped2 out.debug2
@@ -119,6 +119,7 @@ runtest hello_s390.ko 1
 runtest hello_aarch64.ko 1
 runtest hello_m68k.ko 1
 runtest hello_riscv64.ko 1
+runtest hello_csky.ko 1
 
 # self test, shouldn't impact non-ET_REL files at all.
 runtest ${abs_top_builddir}/src/strip 0
diff --git a/tests/testfilecsky.bz2 b/tests/testfilecsky.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..dfee449e7d6e767f32667a40b0d6f910741c54c9
GIT binary patch
literal 3145
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
a#uzKS*^awNY2-W7T%lhnQB2a1`SM>rgqz&}

literal 0
HcmV?d00001

-- 
2.7.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH V4 0/1] Add C-SKY support
@ 2019-07-16 11:16 Mao Han
  2019-07-16 11:16 ` [PATCH V4 1/1] Add backend support for C-SKY Mao Han
  2019-07-16 13:48 ` [PATCH V4 0/1] Add C-SKY support Mark Wielaard
  0 siblings, 2 replies; 5+ messages in thread
From: Mao Han @ 2019-07-16 11:16 UTC (permalink / raw)
  To: mark; +Cc: elfutils-devel, Mao Han

> > The ELF_ARCH was defined as 39 inside linux kernel(before 4.20), so
> > the the core file generated was EM_RCE.
> > I'v regenerated the core file with ELF_ARCH defined as 252:
> > https://github.com/c-sky/test-result/blob/master/elfutils/zeroptr
> > https://github.com/c-sky/test-result/raw/master/elfutils/core.zeroptr
> > We have extended our core dump reg set last year, linux kernel have
> > upstreamed this change, but the gdb does not. I'v only got an old
> > released toolchain(EM_RCE) and the upstream toolchain(out of date
> > reg set) in my enviroment, so I can't generate/verify EM_CSKY core
> > file with any toolchain I have.
> 
> So the zeroptr binary looks correct now.
> But the core.zeroptr is probably generated by an older linux kernel and
> still is EM_RCE. This confusion is a bit confusing since I makes it
> really hard to check the details (register numbering, etc.) are really
> correct. I can tweak the code a bit to accept EM_RCE as EM_CSKY but
> then the PRSTATUS core note doesn't look correct. I am not sure that is
> because the register set as dumped by the kernel is bogus or because
> the prstatus_regs definition in csky_corenote.c is incorrect.

vmh@vmh-VirtualBox:~/workspace/test-result/elfutils$ file core.zeroptr
core.zeroptr: ELF 32-bit LSB core file *unknown arch 0xfc* version 1 (SYSV), SVR4-style, from 'root/zeroptr'

The core.zeroptr should be EM_CSKY now. I've tested the core file with
non-public released toolchain with EM_CSKY(the upstream gdb don't
support csky coredump). GPR seems loaded correctly. I think the
prstatus_regs have the correct reg size (36 * 4), problem may come
from the coredump regs->dwarf regs mapping(the mapping and coredump
support for binutil is not upsteamed).
https://github.com/c-sky/binutils-gdb/blob/fecb9cfcf9ac6e43ec2d971ce064fbb2dccb0847/gdb/csky-tdep.c:
/* Offset mapping table from core_section to regcache of general
   registers for ck810.  */
static int csky_gregset_offset_v2[] =
{
  72,  1,  0, 89,  2,  /* pc, r1, r0, psr, r2.  */
   3,  4,  5,  6,  7,  /* r3 ~ r32.  */
   8,  9, 10, 11, 12,
  13, 14, 15, 16, 17,
  18, 19, 20, 21, 22,
  23, 24, 25, 26, 27,
  28, 29, 30, 31
};
/home/vmh/workspace/buildroot2/buildroot/output/host/bin/csky-linux-gdb zeroptr 
/home/vmh/workspace/buildroot2/buildroot/output/host/bin/csky-linux-gdb: warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB.  Attempting to continue with the default csky settings.

GNU gdb (GDB) 7.12
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=csky-buildroot-linux-gnuabiv2".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...

warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB.  Attempting to continue with the default csky settings.

Reading symbols from zeroptr...done.
(cskygdb) core-file core.zeroptr
[New process 143]
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000000 in ?? ()
(cskygdb) i r
r0             0x1	1
r1             0x7fbbce24	2143014436
r2             0x0	0
r3             0x0	0
r4             0xc4430	803888
r5             0x0	0
r6             0x0	0
r7             0x8bfc	35836
r8             0x7fbbcd50	2143014224
r9             0xc4430	803888
r10            0xc43ec	803820
r11            0xc4190	803216
r12            0xf946246b	-112843669
r13            0x1b81c	112668
r14            0x7fbbcd4c	0x7fbbcd4c
r15            0x8656	34390
r16            0xc443c	803900
r17            0xffffffff	-1
r18            0x67180	422272
r19            0xffffffff	-1
r20            0x2f2f2f2f	791621423
r21            0x0	0
r22            0x1000	4096
r23            0x0	0
r24            0x0	0
r25            0x663ac	418732
r26            0x2ab56f50	716533584
r27            0x0	0
r28            0x2abecbd8	717147096
r29            0x0	0
r30            0x0	0
r31            0x68478	427128
pc             0x0	0x0
epc            <unavailable>
psr            0x140340	1311552
epsr           <unavailable>


> > These attributes including cpu name and some other ISA related
> > descriptions.
> > Some thing like:
> > CSKY_ARCH_NAME: "ck810"
> > CSKY_CPU_NAME:  "ck810f"
> > CSKY_ISA_FLAG:  0x12345678
> > CSKY_ISA_EXT_FLAG:  5
> > They are not documented yet.
> > I'v ask the person who is responsible for these to update the ABI
> > documents, but I think it will take a quite long time for them to
> > do that. They are quite busy at present.
> 
> OK. If you can add that tweak to src/readelf.c and add an
> check_object_attribute hook that handles the above attributes that
> would be good.
> 
> Ideally you also add a testcase for tests/readelf-A.sh
> Some of those tests cheat and create the attributes by hand.
> But it would be nice if you could generate a small .o file with the
> latest toolchain to be used as testcase in some other tests.

I'm not sure about how to handle different data type here. It seems
only tag_name is required when data type is string, I could not
found how to handle int here.
The binary with csky.attribute currently can not be generate with public
released toolchain, so I don't know how to add the testcase.

Tested on x86
============================================================================
Testsuite summary for elfutils 0.176
============================================================================
# TOTAL: 209
# PASS:  204
# SKIP:  5
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================

Changes since v1:
  - Add the Signed-off-by line and the copyright

Changes since v2:
  - move changelog to corresponding entries
  - correct core dump registers size
  - remove unused fpu DWARF register

Changes since v3:
  - add testfilecsky.bz2 and hello_csky.ko.bz2
  - add csky_check_object_attribute

Mao Han (1):
  Add backend support for C-SKY

 backends/ChangeLog       |  12 ++++++
 backends/Makefile.am     |   9 ++++-
 backends/csky_attrs.c    |  67 +++++++++++++++++++++++++++++++
 backends/csky_cfi.c      |  60 ++++++++++++++++++++++++++++
 backends/csky_corenote.c |  61 ++++++++++++++++++++++++++++
 backends/csky_init.c     |  65 ++++++++++++++++++++++++++++++
 backends/csky_initreg.c  |  87 ++++++++++++++++++++++++++++++++++++++++
 backends/csky_regs.c     | 101 +++++++++++++++++++++++++++++++++++++++++++++++
 backends/csky_reloc.def  |  86 ++++++++++++++++++++++++++++++++++++++++
 backends/csky_symbol.c   |  77 ++++++++++++++++++++++++++++++++++++
 libebl/ChangeLog         |   4 ++
 libebl/eblopenbackend.c  |   1 +
 src/ChangeLog            |   4 ++
 src/elflint.c            |   2 +-
 src/readelf.c            |   4 +-
 tests/ChangeLog          |   7 ++++
 tests/hello_csky.ko.bz2  | Bin 0 -> 26448 bytes
 tests/run-addrcfi.sh     |  43 ++++++++++++++++++++
 tests/run-strip-reloc.sh |   3 +-
 tests/testfilecsky.bz2   | Bin 0 -> 3145 bytes
 20 files changed, 688 insertions(+), 5 deletions(-)
 create mode 100644 backends/csky_attrs.c
 create mode 100644 backends/csky_cfi.c
 create mode 100644 backends/csky_corenote.c
 create mode 100644 backends/csky_init.c
 create mode 100644 backends/csky_initreg.c
 create mode 100644 backends/csky_regs.c
 create mode 100644 backends/csky_reloc.def
 create mode 100644 backends/csky_symbol.c
 create mode 100644 tests/hello_csky.ko.bz2
 create mode 100644 tests/testfilecsky.bz2

-- 
2.7.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH V4 0/1] Add C-SKY support
  2019-07-16 11:16 [PATCH V4 0/1] Add C-SKY support Mao Han
  2019-07-16 11:16 ` [PATCH V4 1/1] Add backend support for C-SKY Mao Han
@ 2019-07-16 13:48 ` Mark Wielaard
  2019-07-17  1:21   ` Mao Han
  1 sibling, 1 reply; 5+ messages in thread
From: Mark Wielaard @ 2019-07-16 13:48 UTC (permalink / raw)
  To: Mao Han; +Cc: elfutils-devel

On Tue, 2019-07-16 at 19:14 +0800, Mao Han wrote:
> > > The ELF_ARCH was defined as 39 inside linux kernel(before 4.20),
> > > so
> > > the the core file generated was EM_RCE.
> > > I'v regenerated the core file with ELF_ARCH defined as 252:
> > > https://github.com/c-sky/test-result/blob/master/elfutils/zeroptr
> > > 
https://github.com/c-sky/test-result/raw/master/elfutils/core.zeroptr
> > > We have extended our core dump reg set last year, linux kernel
> > > have
> > > upstreamed this change, but the gdb does not. I'v only got an old
> > > released toolchain(EM_RCE) and the upstream toolchain(out of date
> > > reg set) in my enviroment, so I can't generate/verify EM_CSKY
> > > core
> > > file with any toolchain I have.
> > 
> > So the zeroptr binary looks correct now.
> > But the core.zeroptr is probably generated by an older linux kernel
> > and
> > still is EM_RCE. This confusion is a bit confusing since I makes it
> > really hard to check the details (register numbering, etc.) are
> > really
> > correct. I can tweak the code a bit to accept EM_RCE as EM_CSKY but
> > then the PRSTATUS core note doesn't look correct. I am not sure
> > that is
> > because the register set as dumped by the kernel is bogus or
> > because
> > the prstatus_regs definition in csky_corenote.c is incorrect.
> 
> vmh@vmh-VirtualBox:~/workspace/test-result/elfutils$ file
> core.zeroptr
> core.zeroptr: ELF 32-bit LSB core file *unknown arch 0xfc* version 1
> (SYSV), SVR4-style, from 'root/zeroptr'
> 
> The core.zeroptr should be EM_CSKY now. I've tested the core file
> with
> non-public released toolchain with EM_CSKY(the upstream gdb don't
> support csky coredump). GPR seems loaded correctly. I think the
> prstatus_regs have the correct reg size (36 * 4), problem may come
> from the coredump regs->dwarf regs mapping(the mapping and coredump
> support for binutil is not upsteamed).

You are right. Things look a little garbled because we use
ebl_register_info () and the hook to get the names and types for the
register numbers in various places. But ebl_register_info assumes DWARF
register numbers. We do have ebl_dwarf_to_regno, but we really also
need ebl_regno_to_dwarf. But we don't have it and we should audit the
code to make sure it is used in all the right places.

We have been going over this new backend for a while now. I think the
register mapping are slightly unique in this case (ppc has some
oddness, but we hacked around it without proper hooks...). Lets decide
to tackle this after the release, when we are going to update the ebl
backends anyway. Hopefully by then the rest of the toolchain has been
updated too to the C-SKY ABIv2 making creating testcases easier.

> > > These attributes including cpu name and some other ISA related
> > > descriptions.
> > > Some thing like:
> > > CSKY_ARCH_NAME: "ck810"
> > > CSKY_CPU_NAME:  "ck810f"
> > > CSKY_ISA_FLAG:  0x12345678
> > > CSKY_ISA_EXT_FLAG:  5
> > > They are not documented yet.
> > > I'v ask the person who is responsible for these to update the ABI
> > > documents, but I think it will take a quite long time for them to
> > > do that. They are quite busy at present.
> > 
> > OK. If you can add that tweak to src/readelf.c and add an
> > check_object_attribute hook that handles the above attributes that
> > would be good.
> > 
> > Ideally you also add a testcase for tests/readelf-A.sh
> > Some of those tests cheat and create the attributes by hand.
> > But it would be nice if you could generate a small .o file with the
> > latest toolchain to be used as testcase in some other tests.
> 
> I'm not sure about how to handle different data type here. It seems
> only tag_name is required when data type is string, I could not
> found how to handle int here.
> The binary with csky.attribute currently can not be generate with
> public
> released toolchain, so I don't know how to add the testcase.

OK, lets add a testcase once this has gone upstream in the rest of the
toolchain. Good point about the tag representing a string or number.
But I think this is (accidentially) handled correctly already. See this
comment in readelf.c (print_attributes):

   /* GNU style tags have either a uleb128 value,
      when lowest bit is not set, or a string
      when the lowest bit is set.
      "compatibility" (32) is special.  It has
      both a string and a uleb128 value.  For
      non-gnu we assume 6 till 31 only take ints.
      XXX see arm backend, do we need a separate
      hook?  */

We probably need another hook one day, but it looks like csky follows
this assumption (4 and 5 are strings, 6 and 7 are numbers).

There is one bug in the implementation though. The vendor check is
wrong, checks for "gnu", should obviously be "csky":

diff --git a/backends/csky_attrs.c b/backends/csky_attrs.c
index 9b236f1c..177f0ba2 100644
--- a/backends/csky_attrs.c
+++ b/backends/csky_attrs.c
@@ -43,7 +43,7 @@ csky_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
                            const char **tag_name,
                            const char **value_name __attribute__ ((unused)))
 {
-  if (!strcmp (vendor, "gnu"))
+  if (!strcmp (vendor, "csky"))
     switch (tag)
       {
       case 4:

> Tested on x86
> ============================================================================
> Testsuite summary for elfutils 0.176
> ============================================================================
> # TOTAL: 209
> # PASS:  204
> # SKIP:  5
> # XFAIL: 0
> # FAIL:  0
> # XPASS: 0
> # ERROR: 0
> ============================================================================
> 
> Changes since v1:
>   - Add the Signed-off-by line and the copyright
> 
> Changes since v2:
>   - move changelog to corresponding entries
>   - correct core dump registers size
>   - remove unused fpu DWARF register
> 
> Changes since v3:
>   - add testfilecsky.bz2 and hello_csky.ko.bz2
>   - add csky_check_object_attribute
> 
> Mao Han (1):
>   Add backend support for C-SKY

The new patch looks really good. Thanks. The addition of the testcases
really helps showing things look good. I can make that one small fix
s/gnu/csky/ in csky_attrs.c if you agree that is what was intended.
Then I'll push it to master.

And after the next release we can add some more testcases and handle to
register mappings more correctly.

Thanks,

Mark

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH V4 0/1] Add C-SKY support
  2019-07-16 13:48 ` [PATCH V4 0/1] Add C-SKY support Mark Wielaard
@ 2019-07-17  1:21   ` Mao Han
  2019-07-17 10:00     ` Mark Wielaard
  0 siblings, 1 reply; 5+ messages in thread
From: Mao Han @ 2019-07-17  1:21 UTC (permalink / raw)
  To: Mark Wielaard; +Cc: elfutils-devel

On Tue, Jul 16, 2019 at 03:48:22PM +0200, Mark Wielaard wrote:
> > > > These attributes including cpu name and some other ISA related
> > > > descriptions.
> > > > Some thing like:
> > > > CSKY_ARCH_NAME: "ck810"
> > > > CSKY_CPU_NAME:  "ck810f"
> > > > CSKY_ISA_FLAG:  0x12345678
> > > > CSKY_ISA_EXT_FLAG:  5
> > > > They are not documented yet.
> > > > I'v ask the person who is responsible for these to update the ABI
> > > > documents, but I think it will take a quite long time for them to
> > > > do that. They are quite busy at present.
> > > 
> > > OK. If you can add that tweak to src/readelf.c and add an
> > > check_object_attribute hook that handles the above attributes that
> > > would be good.
> > > 
> > > Ideally you also add a testcase for tests/readelf-A.sh
> > > Some of those tests cheat and create the attributes by hand.
> > > But it would be nice if you could generate a small .o file with the
> > > latest toolchain to be used as testcase in some other tests.
> > 
> > I'm not sure about how to handle different data type here. It seems
> > only tag_name is required when data type is string, I could not
> > found how to handle int here.
> > The binary with csky.attribute currently can not be generate with
> > public
> > released toolchain, so I don't know how to add the testcase.
> 
> OK, lets add a testcase once this has gone upstream in the rest of the
> toolchain. Good point about the tag representing a string or number.
> But I think this is (accidentially) handled correctly already. See this
> comment in readelf.c (print_attributes):
> 
>    /* GNU style tags have either a uleb128 value,
>       when lowest bit is not set, or a string
>       when the lowest bit is set.
>       "compatibility" (32) is special.  It has
>       both a string and a uleb128 value.  For
>       non-gnu we assume 6 till 31 only take ints.
>       XXX see arm backend, do we need a separate
>       hook?  */
> 
> We probably need another hook one day, but it looks like csky follows
> this assumption (4 and 5 are strings, 6 and 7 are numbers).

Yes, csky follows this assumption, so it is handled correctly already.
 
> There is one bug in the implementation though. The vendor check is
> wrong, checks for "gnu", should obviously be "csky":
> 
> diff --git a/backends/csky_attrs.c b/backends/csky_attrs.c
> index 9b236f1c..177f0ba2 100644
> --- a/backends/csky_attrs.c
> +++ b/backends/csky_attrs.c
> @@ -43,7 +43,7 @@ csky_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
>                             const char **tag_name,
>                             const char **value_name __attribute__ ((unused)))
>  {
> -  if (!strcmp (vendor, "gnu"))
> +  if (!strcmp (vendor, "csky"))
>      switch (tag)
>        {
>        case 4:
> 
> > Tested on x86
> > ============================================================================
> > Testsuite summary for elfutils 0.176
> > ============================================================================
> > # TOTAL: 209
> > # PASS:  204
> > # SKIP:  5
> > # XFAIL: 0
> > # FAIL:  0
> > # XPASS: 0
> > # ERROR: 0
> > ============================================================================
> > 
> > Changes since v1:
> >   - Add the Signed-off-by line and the copyright
> > 
> > Changes since v2:
> >   - move changelog to corresponding entries
> >   - correct core dump registers size
> >   - remove unused fpu DWARF register
> > 
> > Changes since v3:
> >   - add testfilecsky.bz2 and hello_csky.ko.bz2
> >   - add csky_check_object_attribute
> > 
> > Mao Han (1):
> >   Add backend support for C-SKY
> 
> The new patch looks really good. Thanks. The addition of the testcases
> really helps showing things look good. I can make that one small fix
> s/gnu/csky/ in csky_attrs.c if you agree that is what was intended.
> Then I'll push it to master.

Yes, please. Thanks for your review and help improveing the patch.

> And after the next release we can add some more testcases and handle to
> register mappings more correctly.
OK.

Thanks,
Mao Han

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH V4 0/1] Add C-SKY support
  2019-07-17  1:21   ` Mao Han
@ 2019-07-17 10:00     ` Mark Wielaard
  0 siblings, 0 replies; 5+ messages in thread
From: Mark Wielaard @ 2019-07-17 10:00 UTC (permalink / raw)
  To: Mao Han; +Cc: elfutils-devel

Hi Mao Han,

On Wed, 2019-07-17 at 09:19 +0800, Mao Han wrote:
> > The new patch looks really good. Thanks. The addition of the testcases
> > really helps showing things look good. I can make that one small fix
> > s/gnu/csky/ in csky_attrs.c if you agree that is what was intended.
> > Then I'll push it to master.
> 
> Yes, please. Thanks for your review and help improveing the patch.

Pushed (with one small tweak, added the new test bz2 files to
EXTRA_DIST so they will also be in any release tar balls).

Thanks,

Mark

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-07-17 10:00 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-16 11:16 [PATCH V4 0/1] Add C-SKY support Mao Han
2019-07-16 11:16 ` [PATCH V4 1/1] Add backend support for C-SKY Mao Han
2019-07-16 13:48 ` [PATCH V4 0/1] Add C-SKY support Mark Wielaard
2019-07-17  1:21   ` Mao Han
2019-07-17 10:00     ` Mark Wielaard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).