diff mbox series

[RFC,05/66] Hexagon Disassembler

Message ID 1581381644-13678-6-git-send-email-tsimpson@quicinc.com
State New
Headers show
Series Hexagon patch series | expand

Commit Message

Taylor Simpson Feb. 11, 2020, 12:39 a.m. UTC
The Hexagon disassembler calls disassemble_hexagon to decode a packet
and format it for printing

Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
---
 disas/Makefile.objs     |  1 +
 disas/hexagon.c         | 56 +++++++++++++++++++++++++++++++++++++++++++++++++
 include/disas/dis-asm.h |  1 +
 3 files changed, 58 insertions(+)
 create mode 100644 disas/hexagon.c

Comments

Philippe Mathieu-Daudé Feb. 11, 2020, 7:20 a.m. UTC | #1
On 2/11/20 1:39 AM, Taylor Simpson wrote:
> The Hexagon disassembler calls disassemble_hexagon to decode a packet
> and format it for printing
> 
> Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
> ---
>   disas/Makefile.objs     |  1 +
>   disas/hexagon.c         | 56 +++++++++++++++++++++++++++++++++++++++++++++++++
>   include/disas/dis-asm.h |  1 +
>   3 files changed, 58 insertions(+)
>   create mode 100644 disas/hexagon.c
> 
> diff --git a/disas/Makefile.objs b/disas/Makefile.objs
> index 3c1cdce..0e86964 100644
> --- a/disas/Makefile.objs
> +++ b/disas/Makefile.objs
> @@ -24,6 +24,7 @@ common-obj-$(CONFIG_SH4_DIS) += sh4.o
>   common-obj-$(CONFIG_SPARC_DIS) += sparc.o
>   common-obj-$(CONFIG_LM32_DIS) += lm32.o
>   common-obj-$(CONFIG_XTENSA_DIS) += xtensa.o
> +common-obj-$(CONFIG_HEXAGON_DIS) += hexagon.o
>   
>   # TODO: As long as the TCG interpreter and its generated code depend
>   # on the QEMU target, we cannot compile the disassembler here.
> diff --git a/disas/hexagon.c b/disas/hexagon.c
> new file mode 100644
> index 0000000..fd9af10
> --- /dev/null
> +++ b/disas/hexagon.c
> @@ -0,0 +1,56 @@
> +/*
> + *  Copyright (c) 2019 Qualcomm Innovation Center, Inc. All Rights Reserved.
> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of 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.
> + *
> + *  This program 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 a copy of the GNU General Public License
> + *  along with this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/*
> + * QEMU Hexagon Disassembler
> + */
> +
> +#include "qemu/osdep.h"
> +#include "disas/dis-asm.h"
> +#include "target/hexagon/cpu_bits.h"
> +
> +int print_insn_hexagon(bfd_vma memaddr, struct disassemble_info *info)
> +{
> +    uint32_t words[PACKET_WORDS_MAX];
> +    int len, slen;
> +    char buf[1028];

Why 1028?

> +    int status;
> +    int i;
> +
> +    for (i = 0; i < PACKET_WORDS_MAX; i++) {
> +        status = (*info->read_memory_func)(memaddr + i * sizeof(uint32_t),
> +                                           (bfd_byte *)&words[i],
> +                                           sizeof(uint32_t), info);
> +        if (status) {
> +            if (i > 0) {
> +                break;
> +            }
> +            (*info->memory_error_func)(status, memaddr, info);
> +            return status;
> +        }
> +    }
> +
> +    len = disassemble_hexagon(words, i, buf, 1028);

1028 -> sizeof(buf)

> +    slen = strlen(buf);
> +    if (buf[slen - 1] == '\n') {
> +        buf[slen - 1] = '\0';
> +    }
> +    (*info->fprintf_func)(info->stream, "%s", buf);
> +
> +    return len;
> +}
> +
> diff --git a/include/disas/dis-asm.h b/include/disas/dis-asm.h
> index f87f468..a7fa82d 100644
> --- a/include/disas/dis-asm.h
> +++ b/include/disas/dis-asm.h
> @@ -436,6 +436,7 @@ int print_insn_little_nios2     (bfd_vma, disassemble_info*);
>   int print_insn_xtensa           (bfd_vma, disassemble_info*);
>   int print_insn_riscv32          (bfd_vma, disassemble_info*);
>   int print_insn_riscv64          (bfd_vma, disassemble_info*);
> +int print_insn_hexagon          (bfd_vma, disassemble_info*);
>   
>   #if 0
>   /* Fetch the disassembler for a given BFD, if that support is available.  */
>
diff mbox series

Patch

diff --git a/disas/Makefile.objs b/disas/Makefile.objs
index 3c1cdce..0e86964 100644
--- a/disas/Makefile.objs
+++ b/disas/Makefile.objs
@@ -24,6 +24,7 @@  common-obj-$(CONFIG_SH4_DIS) += sh4.o
 common-obj-$(CONFIG_SPARC_DIS) += sparc.o
 common-obj-$(CONFIG_LM32_DIS) += lm32.o
 common-obj-$(CONFIG_XTENSA_DIS) += xtensa.o
+common-obj-$(CONFIG_HEXAGON_DIS) += hexagon.o
 
 # TODO: As long as the TCG interpreter and its generated code depend
 # on the QEMU target, we cannot compile the disassembler here.
diff --git a/disas/hexagon.c b/disas/hexagon.c
new file mode 100644
index 0000000..fd9af10
--- /dev/null
+++ b/disas/hexagon.c
@@ -0,0 +1,56 @@ 
+/*
+ *  Copyright (c) 2019 Qualcomm Innovation Center, Inc. All Rights Reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of 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.
+ *
+ *  This program 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 a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * QEMU Hexagon Disassembler
+ */
+
+#include "qemu/osdep.h"
+#include "disas/dis-asm.h"
+#include "target/hexagon/cpu_bits.h"
+
+int print_insn_hexagon(bfd_vma memaddr, struct disassemble_info *info)
+{
+    uint32_t words[PACKET_WORDS_MAX];
+    int len, slen;
+    char buf[1028];
+    int status;
+    int i;
+
+    for (i = 0; i < PACKET_WORDS_MAX; i++) {
+        status = (*info->read_memory_func)(memaddr + i * sizeof(uint32_t),
+                                           (bfd_byte *)&words[i],
+                                           sizeof(uint32_t), info);
+        if (status) {
+            if (i > 0) {
+                break;
+            }
+            (*info->memory_error_func)(status, memaddr, info);
+            return status;
+        }
+    }
+
+    len = disassemble_hexagon(words, i, buf, 1028);
+    slen = strlen(buf);
+    if (buf[slen - 1] == '\n') {
+        buf[slen - 1] = '\0';
+    }
+    (*info->fprintf_func)(info->stream, "%s", buf);
+
+    return len;
+}
+
diff --git a/include/disas/dis-asm.h b/include/disas/dis-asm.h
index f87f468..a7fa82d 100644
--- a/include/disas/dis-asm.h
+++ b/include/disas/dis-asm.h
@@ -436,6 +436,7 @@  int print_insn_little_nios2     (bfd_vma, disassemble_info*);
 int print_insn_xtensa           (bfd_vma, disassemble_info*);
 int print_insn_riscv32          (bfd_vma, disassemble_info*);
 int print_insn_riscv64          (bfd_vma, disassemble_info*);
+int print_insn_hexagon          (bfd_vma, disassemble_info*);
 
 #if 0
 /* Fetch the disassembler for a given BFD, if that support is available.  */