diff mbox series

[v6,05/35] Hexagon (disas) disassembler

Message ID 1610080146-14968-6-git-send-email-tsimpson@quicinc.com
State New
Headers show
Series [v6,01/35] Hexagon Update MAINTAINERS file | expand

Commit Message

Taylor Simpson Jan. 8, 2021, 4:28 a.m. UTC
Add hexagon to disas/meson.build
Add disas/hexagon.c
Add hexagon to include/disas/dis-asm.h

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

Comments

Philippe Mathieu-Daudé Jan. 9, 2021, 9:37 p.m. UTC | #1
Hi Taylor,

On 1/8/21 5:28 AM, Taylor Simpson wrote:
> Add hexagon to disas/meson.build
> Add disas/hexagon.c
> Add hexagon to include/disas/dis-asm.h
> 
> Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
> ---
>  include/disas/dis-asm.h |  1 +
>  disas/hexagon.c         | 68 +++++++++++++++++++++++++++++++++++++++++++++++++
>  disas/meson.build       |  1 +
>  3 files changed, 70 insertions(+)
>  create mode 100644 disas/hexagon.c
> 
> diff --git a/include/disas/dis-asm.h b/include/disas/dis-asm.h
> index 2164762..1f54fc0 100644
> --- a/include/disas/dis-asm.h
> +++ b/include/disas/dis-asm.h
> @@ -459,6 +459,7 @@ 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_rx(bfd_vma, disassemble_info *);
> +int print_insn_hexagon(bfd_vma, disassemble_info *);
>  
>  #ifdef CONFIG_CAPSTONE
>  bool cap_disas_target(disassemble_info *info, uint64_t pc, size_t size);
> diff --git a/disas/hexagon.c b/disas/hexagon.c
> new file mode 100644
> index 0000000..968f11c
> --- /dev/null
> +++ b/disas/hexagon.c
> @@ -0,0 +1,68 @@
> +/*
> + *  Copyright(c) 2019-2020 Qualcomm Innovation Center, Inc. All Rights Reserved.

2019-2021 :)

> + *
> + *  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/>.

If possible please also include the SPDX identifier (or simply it):

SPDX-License-Identifier: GPL-2.0-or-later

> + */
> +
> +/*
> + * QEMU Hexagon Disassembler
> + */
> +
> +#include "qemu/osdep.h"
> +#include "disas/dis-asm.h"
> +#include "target/hexagon/cpu_bits.h"
> +
> +/*
> + * We will disassemble a packet with up to 4 instructions, so we need
> + * a hefty size buffer.
> + */
> +#define PACKET_BUFFER_LEN                   1028
> +
> +int print_insn_hexagon(bfd_vma memaddr, struct disassemble_info *info)
> +{
> +    uint32_t words[PACKET_WORDS_MAX];
> +    bool found_end = false;
> +    char buf[PACKET_BUFFER_LEN];
> +    int i;
> +
> +    for (i = 0; i < PACKET_WORDS_MAX && !found_end; i++) {
> +        int 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;
> +        }
> +        if (is_packet_end(words[i])) {
> +            found_end = true;
> +        }
> +    }
> +
> +    if (!found_end) {
> +        (*info->fprintf_func)(info->stream, "<invalid>");
> +        return PACKET_WORDS_MAX * 4;

I suppose 4 is sizeof(uint32_t), right?

> +    }
> +
> +    int len = disassemble_hexagon(words, i, memaddr, buf, PACKET_BUFFER_LEN);
> +    int slen = strlen(buf);

Per QEMU's CODING_STYLE.rst:

  Declarations
  ============

  Mixed declarations (interleaving statements and declarations within
  blocks) are generally not allowed; declarations should be at the
  beginning of blocks.

> +    if (buf[slen - 1] == '\n') {
> +        buf[slen - 1] = '\0';
> +    }
> +    (*info->fprintf_func)(info->stream, "%s", buf);
> +
> +    return len;
> +}
> diff --git a/disas/meson.build b/disas/meson.build
> index 09a8527..b7b659b 100644
> --- a/disas/meson.build
> +++ b/disas/meson.build
> @@ -6,6 +6,7 @@ common_ss.add(when: 'CONFIG_ARM_A64_DIS', if_true: files('arm-a64.cc'))
>  common_ss.add_all(when: 'CONFIG_ARM_A64_DIS', if_true: libvixl_ss)
>  common_ss.add(when: 'CONFIG_ARM_DIS', if_true: files('arm.c'))
>  common_ss.add(when: 'CONFIG_CRIS_DIS', if_true: files('cris.c'))
> +common_ss.add(when: 'CONFIG_HEXAGON_DIS', if_true: files('hexagon.c'))
>  common_ss.add(when: 'CONFIG_HPPA_DIS', if_true: files('hppa.c'))
>  common_ss.add(when: 'CONFIG_I386_DIS', if_true: files('i386.c'))
>  common_ss.add(when: 'CONFIG_LM32_DIS', if_true: files('lm32.c'))
> 

Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

With comments addressed:
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Taylor Simpson Jan. 11, 2021, 9:14 p.m. UTC | #2
> -----Original Message-----
> From: Qemu-devel <qemu-devel-
> bounces+tsimpson=quicinc.com@nongnu.org> On Behalf Of Philippe
> Mathieu-Daudé
> Sent: Saturday, January 9, 2021 3:38 PM
> To: Taylor Simpson <tsimpson@quicinc.com>; qemu-devel@nongnu.org
> Cc: ale@rev.ng; Brian Cain <bcain@quicinc.com>;
> richard.henderson@linaro.org; laurent@vivier.eu
> Subject: Re: [PATCH v6 05/35] Hexagon (disas) disassembler
>
> Hi Taylor,
>
> On 1/8/21 5:28 AM, Taylor Simpson wrote:
> > +/*
> > + *  Copyright(c) 2019-2020 Qualcomm Innovation Center, Inc. All Rights
> Reserved.
>
> 2019-2021 :)
>
> > + *
> > + *  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/>.
>
> If possible please also include the SPDX identifier (or simply it):
>
> SPDX-License-Identifier: GPL-2.0-or-later

I'll confirm with our legal department.  Which is preferred - the identifier alone or the text and the identifier?
Philippe Mathieu-Daudé Jan. 11, 2021, 10:20 p.m. UTC | #3
+Thomas/Daniel/Peter.

On 1/11/21 10:14 PM, Taylor Simpson wrote:
>> -----Original Message-----
>> From: Qemu-devel <qemu-devel-
>> bounces+tsimpson=quicinc.com@nongnu.org> On Behalf Of Philippe
>> Mathieu-Daudé
>> Sent: Saturday, January 9, 2021 3:38 PM
>> To: Taylor Simpson <tsimpson@quicinc.com>; qemu-devel@nongnu.org
>> Cc: ale@rev.ng; Brian Cain <bcain@quicinc.com>;
>> richard.henderson@linaro.org; laurent@vivier.eu
>> Subject: Re: [PATCH v6 05/35] Hexagon (disas) disassembler
>>
>> Hi Taylor,
>>
>> On 1/8/21 5:28 AM, Taylor Simpson wrote:
>>> +/*
>>> + *  Copyright(c) 2019-2020 Qualcomm Innovation Center, Inc. All Rights
>> Reserved.
>>
>> 2019-2021 :)
>>
>>> + *
>>> + *  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/>.
>>
>> If possible please also include the SPDX identifier (or simply it):
>>
>> SPDX-License-Identifier: GPL-2.0-or-later
> 
> I'll confirm with our legal department.  Which is preferred - the identifier alone or the text and the identifier?

Obviously IANAL, but my understanding from explanations from Thomas and
Daniel is -- if one day QEMU switches to using SPDX -- when both are
provided, it is very hard to remove a text license (which often is
copy/pasted with mistakes). So the identifier alone is better (assuming
your legal department confirms it has the same value).

Now if you ask if there is any plan QEMU switch to SPDX, I'd say this
is a gray zone. Peter expressively said he prefers a full switch or
nothing. We don't have the resources for it. Meanwhile some companies
prefer their employees to send new contributions with SPDX as it eases
their compliance audit tools.

I guess Thomas spend 1 week on this topic. TBH I spent more than 2 weeks
and barely added the SPDX tag to a bit more than 30% of the codebase
then had to give up because my time was over (this was when I understood
I couldn't remove the text and had to redo the work).

Not sure how this can be coordinated. As long as there is no strong
corporate interest, this might stay in this gray zone...

Regards,

Phil.
Daniel P. Berrangé Jan. 12, 2021, 9:35 a.m. UTC | #4
On Mon, Jan 11, 2021 at 11:20:27PM +0100, Philippe Mathieu-Daudé wrote:
> +Thomas/Daniel/Peter.
> 
> On 1/11/21 10:14 PM, Taylor Simpson wrote:
> >> -----Original Message-----
> >> From: Qemu-devel <qemu-devel-
> >> bounces+tsimpson=quicinc.com@nongnu.org> On Behalf Of Philippe
> >> Mathieu-Daudé
> >> Sent: Saturday, January 9, 2021 3:38 PM
> >> To: Taylor Simpson <tsimpson@quicinc.com>; qemu-devel@nongnu.org
> >> Cc: ale@rev.ng; Brian Cain <bcain@quicinc.com>;
> >> richard.henderson@linaro.org; laurent@vivier.eu
> >> Subject: Re: [PATCH v6 05/35] Hexagon (disas) disassembler
> >>
> >> Hi Taylor,
> >>
> >> On 1/8/21 5:28 AM, Taylor Simpson wrote:
> >>> +/*
> >>> + *  Copyright(c) 2019-2020 Qualcomm Innovation Center, Inc. All Rights
> >> Reserved.
> >>
> >> 2019-2021 :)
> >>
> >>> + *
> >>> + *  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/>.
> >>
> >> If possible please also include the SPDX identifier (or simply it):
> >>
> >> SPDX-License-Identifier: GPL-2.0-or-later
> > 
> > I'll confirm with our legal department.  Which is preferred - the identifier alone or the text and the identifier?
> 
> Obviously IANAL, but my understanding from explanations from Thomas and
> Daniel is -- if one day QEMU switches to using SPDX -- when both are
> provided, it is very hard to remove a text license (which often is
> copy/pasted with mistakes). So the identifier alone is better (assuming
> your legal department confirms it has the same value).
> 
> Now if you ask if there is any plan QEMU switch to SPDX, I'd say this
> is a gray zone. Peter expressively said he prefers a full switch or
> nothing. We don't have the resources for it. Meanwhile some companies
> prefer their employees to send new contributions with SPDX as it eases
> their compliance audit tools.
> 
> I guess Thomas spend 1 week on this topic. TBH I spent more than 2 weeks
> and barely added the SPDX tag to a bit more than 30% of the codebase
> then had to give up because my time was over (this was when I understood
> I couldn't remove the text and had to redo the work).
> 
> Not sure how this can be coordinated. As long as there is no strong
> corporate interest, this might stay in this gray zone...

I can't see us removing all existing license boilerplate because
of the legal challenges that involves. The amount of work does not
justify the potential payoff, as compared to all the other useful
things that could be worked on in QEMU.

My expectation is that all files should have license header for the
sake of consistency across the codebase, and may optionally have SPDX.

With all this in mind, IMHO reviewers should NOT be raising with
contributions to QEMU, as it creates a burden for contributors
to talk to their legal teams. The amount of new files being added to
QEMU are negligible compared to what's already in tree, so any new files
we accept aren't making the situation measurably worse.

Just accept files with normal license headers as we've always done.

Anything involving SPDX in future will just need to bulk updates
everything.

Regards,
Daniel
diff mbox series

Patch

diff --git a/include/disas/dis-asm.h b/include/disas/dis-asm.h
index 2164762..1f54fc0 100644
--- a/include/disas/dis-asm.h
+++ b/include/disas/dis-asm.h
@@ -459,6 +459,7 @@  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_rx(bfd_vma, disassemble_info *);
+int print_insn_hexagon(bfd_vma, disassemble_info *);
 
 #ifdef CONFIG_CAPSTONE
 bool cap_disas_target(disassemble_info *info, uint64_t pc, size_t size);
diff --git a/disas/hexagon.c b/disas/hexagon.c
new file mode 100644
index 0000000..968f11c
--- /dev/null
+++ b/disas/hexagon.c
@@ -0,0 +1,68 @@ 
+/*
+ *  Copyright(c) 2019-2020 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"
+
+/*
+ * We will disassemble a packet with up to 4 instructions, so we need
+ * a hefty size buffer.
+ */
+#define PACKET_BUFFER_LEN                   1028
+
+int print_insn_hexagon(bfd_vma memaddr, struct disassemble_info *info)
+{
+    uint32_t words[PACKET_WORDS_MAX];
+    bool found_end = false;
+    char buf[PACKET_BUFFER_LEN];
+    int i;
+
+    for (i = 0; i < PACKET_WORDS_MAX && !found_end; i++) {
+        int 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;
+        }
+        if (is_packet_end(words[i])) {
+            found_end = true;
+        }
+    }
+
+    if (!found_end) {
+        (*info->fprintf_func)(info->stream, "<invalid>");
+        return PACKET_WORDS_MAX * 4;
+    }
+
+    int len = disassemble_hexagon(words, i, memaddr, buf, PACKET_BUFFER_LEN);
+    int slen = strlen(buf);
+    if (buf[slen - 1] == '\n') {
+        buf[slen - 1] = '\0';
+    }
+    (*info->fprintf_func)(info->stream, "%s", buf);
+
+    return len;
+}
diff --git a/disas/meson.build b/disas/meson.build
index 09a8527..b7b659b 100644
--- a/disas/meson.build
+++ b/disas/meson.build
@@ -6,6 +6,7 @@  common_ss.add(when: 'CONFIG_ARM_A64_DIS', if_true: files('arm-a64.cc'))
 common_ss.add_all(when: 'CONFIG_ARM_A64_DIS', if_true: libvixl_ss)
 common_ss.add(when: 'CONFIG_ARM_DIS', if_true: files('arm.c'))
 common_ss.add(when: 'CONFIG_CRIS_DIS', if_true: files('cris.c'))
+common_ss.add(when: 'CONFIG_HEXAGON_DIS', if_true: files('hexagon.c'))
 common_ss.add(when: 'CONFIG_HPPA_DIS', if_true: files('hppa.c'))
 common_ss.add(when: 'CONFIG_I386_DIS', if_true: files('i386.c'))
 common_ss.add(when: 'CONFIG_LM32_DIS', if_true: files('lm32.c'))