Taylor Simpson <tsimp...@quicinc.com> writes:
> This series adds support for the Hexagon processor with Linux user support > > See patch 02/33 Hexagon README for detailed information. > > This series assumes int128_or() is implemented. > https://lists.nongnu.org/archive/html/qemu-devel/2020-10/msg06004.html > > The series is also available at https://github.com/quic/qemu on branch > small_series_v6. > > > Once the series is applied, the Hexagon port will pass "make check-tcg". > The series also includes Hexagon-specific tests in tcg/tests/hexagon. > > The final 3 patches in the series add docker support. Thanks to Alessandro > Di Federico <a...@rev.ng> and Brian Cain <bc...@quicinc.com> for making this > happen. The container files will build a Hexagon toolchain from source. > Alternatively, this command will get a pre-built container > docker pull revng/qemu:debian-hexagon-cross > Ultimately, we'll a method to create a container without building the > toolchain. > > Once the container is set up, here are the commands to verify the code: > mkdir build > cd build > ../configure --target-list=hexagon-linux-user > make > make check-tcg DOCKER_IMAGE=debian-hexagon-cross \ > DOCKER_CROSS_CC_GUEST=hexagon-unknown-linux-musl-clang check-tcg should be picking up the DOCKER_IMAGE and DOCKER_CROSS_CC_GUEST values from the configure.sh script settings which get dumped in $BLDIR/tests/tcg/config-hexagon.mak You can run just the hexagon tests with: make run-tcg-tests-hexagon-linux-user > > > *** Known checkpatch issues *** > > The following are known checkpatch errors in the series > target/hexagon/reg_fields.h Complex macro > target/hexagon/attribs.h Complex macro > target/hexagon/decode.c Complex macro > target/hexagon/q6v_decode.c Macro needs do - while > target/hexagon/printinsn.c Macro needs do - while > target/hexagon/gen_semantics.c Suspicious ; after while (0) > target/hexagon/gen_dectree_import.c Complex macro > target/hexagon/gen_dectree_import.c Suspicious ; after while (0) > target/hexagon/opcodes.c Complex macro > target/hexagon/iclass.h Complex macro > configure.sh Line over 90 characters > tests/tcg/configure.sh Line over 90 characters > scripts/qemu-binfmt-conf.sh Line over 90 characters > > The following are known checkpatch warnings in the series > target/hexagon/fma_emu.c Comments inside macro definition > target/hexagon/gen_tcg_funcs.py Line over 80 characters > scripts/qemu-binfmt-conf.sh Line over 80 characters > > *** Changes in v6 *** > Correct QEMU_GENERATE implementations for fLSBNEW0/fLSBNEW1 > Change Python file handling to use with statement > Change import hex_common to be explicit > Generator cleanup > Change N?N (new value) to value instead of register number for consistency > Fixed bud in reading control register pair > Add ctx_log_reg_write_pair > Clean up control reg offset from HEX_REG_SA0 > Fix errors in FP instructions uncovered by musl libc-tests > Added unit tests > > *** Changes in v5 *** > Bug fixes > Properly implement circular addressing > memw(r1++I:circ(m0)) = r2 > Make gen_cmpnd_cmp_jmp execute in 2 parts > > Address remaining blocker items from Richard Henderson's review. > Use qemu softfloat > Use const where appropriate > Break tcg_funcs_generated.h into two files - functions and table > Change struct and enum type names to CamelCase > Include packet in raw bytes in assembly > Use DEF_HELPER_FLAGS where possible > Fix merge_bytes endianness and overlap test by doing the store before load > Use bitmask instead of string in decoding > Add comments to decoder > Use qemu/int128.h > Use qemu/bitops.h for instruction attributes > Add bitmask for ctx->reg_log > Note we still have the array/idx for iteration during > gen_commit_packet > Change opcode_syntax to be created at compile time in gen_dectree_import.c > Remove unused tmp variables > Isolate hex_arch_types to imported files > Fix git am whitespace warnings > > Address items from Philippe Mathieu-Daudé's review > Split utility functions patch into 3 digestable patches > Fixed type "definition" > Change all exit codes to be either 0 or 1 > Validated build with gcc 4.8, 5.5, and ***** > Removed qemu/osdep.h and qemu/host-utils.h from macros.h > > Address items from Laurent Vivier's review > Don't filter out __NR_syscalls > Remove syscall_nr_generators from linux-user/hexagon/meson.build > Remove subdir('hexagon') from linux-user/meson.build > Generate syscall_nr.h from 5.5 Linux kernel > > > *** Changes in v4 *** > Convert target/hexagon/Makefile.objs to meson.build > > Address portions of feedback from Richard Henderson. Here is the table > of items from Richard's review. > Patch Item Blocker Status > Use qemu softfloat Yes > Use qemu decodetree.py No > Several Use const when appropriate Yes > Several Remove anything after g_assert_not_reached Yes DONE > Several Fix log_store32/64 add/remove/add in patch series Yes DONE > Several Follow naming guidelines for structs and enums Yes > 4 Move decls to cpu-param.h Yes DONE > 4 Remove CONFIG_USER_ONLY ifdef's Yes DONE > 4 Remove DEBUG_HEXAGON Yes Partially > 4 Remove stack pointer modification hack Yes DONE > 4 Add property x-lldb-compat to control output Yes DONE > 6 Include instruction and raw bytes in disassembly Yes > 7 Use DEF_HELPER_FLAGS No > 07, 26 Endianness of merge_bytes Yes > 7 Fix overlap test Yes > 7 Remove HELPER(debug_value)/HELPER(debug_value_i64) Yes DONE > 9 Include "qemu/osdep.h" instead of <stdint.h> Yes DONE > Several Stick with stdint.h types except in imported files Yes DONE > 11 Remove description from reg field definitions Yes DONE > 13 Move regmap.h into decode.c Yes DONE > 14, 27 Use bit mask instead of strings in decoding No > 14 Add comments to decoder Yes > 16 Use qemu/int128.h No > 17 Squash patches dealing with imported files Yes DONE > 24 Use qemu/bitops.h for instruction attributes No > 24 Fix initialization of opcode_short_semantics Yes DONE > 24 Change if (p == NULL) { g_assert_not_reached(); } > to assert(p != NULL) No DONE > 25 Expand DECL/READ/WRITE/FREE macros in generator Yes DONE > 26 Rewrite fINSERT*, fEXTRACT*, f?XTN macros Yes DONE > 26 Investigate fRND macro No DONE > 26 Change REG = REG to (VOID)REG to suppress warning Yes DONE > 27 Remove multiple includes of imported/iclass.def Yes DONE > 28 Move genptr_helpers.h into genptr.c Yes DONE > 28 Remove unneeded temps No DONE > 28 Use tcg_gen_deposit_tl and tcg_gen_extract_tl > when dealing with p3_0 No DONE > 29 Size opcode_genptr[] properly and initialize > with [TAG] = generate_##TAG Yes DONE > 30 Don't generate helpers for overridden instructions Yes DONE > Don't include "gen_tcg.h" in helper.h Yes DONE > 31 Use bitmask for ctx->reg_log instead of an array Yes > 31 Use tcg_gen_extract_i32 for gen_slot_cancelled_check Yes DONE > 31 Properly deal with reading instructions across > a page boundary and too many instructions before > finding end-of-packet Yes DONE > 31 Don't set PC at the beginning of every packet No > 31 Don't set slot_cancelled unless needed No > 31 Don't set hex_pred_written unless needed No > 31 Change cancelled variable to not local Yes DONE > 31 Remove unnecessary temp Yes DONE > 31 Let tcg_gen_addi_tl check for zero Yes DONE > 31 Move gen_exec_counters to end of TB No > 31 Move end of TB handling to hexagon_tr_tb_stop Yes DONE > Generate two lists for TCG functions instead of > the DEF_TCG_FUNC macro Yes DONE > > > *** Changes in v3 *** > Remove substantial portions of the code to facilitate review > - Plan to submit subsequent patches > - Hexagon Vector eXtensions (HVX) > - Circular and bit-reverse addressiong > - Add/sub-with-carry > - Unused insn_t and pkt_t fields > - Unused instruction attributes > - All TCG overrides except instructions with multiple definitions > - Unused macros > - Unused reg fields > - COUNT_HEX_HELPERS > Use Laurent's gensyscall.sh script to generate linux-user/hexagon/syscall_nr.h > Handle mem_noshuf > Remove "RsV = RsV" per review feedback > Simplify include file structure > Add directed tests in <qemu>/tests/tcg/hexagon > Change fWRAP_* macros to fGEN_TCG_* > > *** Changes in v2 *** > - Use scripts/git.orderfile > - Create a README with the code overview in patch 0001 > - Change #define's in hex_regs.h to an enum > - Replace hard coded disassembly buffer length (1028) with #define > - Move Hexagon architecture types patch earlier in series > - Replace #include standard header files with #include "qemu/osdep.h" > - Prefix all header file #ifndef's with HEXAGON_ > - Update python version to python3 > - #include "tcg/tcg.h" in genptr_helpers.h > - Change target/hexagon/Makefile.objs to support out-of-tree build > - Updated copyright to include year 2020 > - Bug fixes > Fix some problems with HEX_DEBUG output > Fix bug in circular addressing > - Optimizations to reduce the amount of TCG code generated > Change pred_written from an array to a bit mask > > > > Alessandro Di Federico (3): > Add Dockerfile for hexagon > Auto-import Docker support files > Add newline when generating Dockerfile > > Taylor Simpson (32): > Hexagon Update MAINTAINERS file > Hexagon (target/hexagon) README > Hexagon (include/elf.h) ELF machine definition > Hexagon (target/hexagon) scalar core definition > Hexagon (disas) disassembler > Hexagon (target/hexagon) register names > Hexagon (target/hexagon) scalar core helpers > Hexagon (target/hexagon) GDB Stub > Hexagon (target/hexagon) architecture types > Hexagon (target/hexagon) instruction and packet types > Hexagon (target/hexagon) register fields > Hexagon (target/hexagon) instruction attributes > Hexagon (target/hexagon) instruction/packet decode > Hexagon (target/hexagon) instruction printing > Hexagon (target/hexagon/arch.[ch]) utility functions > Hexagon (target/hexagon/conv_emu.[ch]) utility functions > Hexagon (target/hexagon/fma_emu.[ch]) utility functions > Hexagon (target/hexagon/imported) arch import > Hexagon (target/hexagon) generator phase 1 - C preprocessor for > semantics > Hexagon (target/hexagon) generator phase 2 - generate header files > Hexagon (target/hexagon) generator phase 3 - C preprocessor for decode > tree > Hexagon (target/hexagon) generater phase 4 - decode tree > Hexagon (target/hexagon) opcode data structures > Hexagon (target/hexagon) macros > Hexagon (target/hexagon) instruction classes > Hexagon (target/hexagon) TCG generation > Hexagon (target/hexagon) TCG for instructions with multiple > definitions > Hexagon (target/hexagon) TCG for floating point instructions > Hexagon (target/hexagon) translation > Hexagon (linux-user/hexagon) Linux user emulation > Hexagon (tests/tcg/hexagon) TCG tests > Hexagon build infrastructure > > default-configs/targets/hexagon-linux-user.mak | 1 + > meson.build | 1 + > include/disas/dis-asm.h | 1 + > include/elf.h | 1 + > linux-user/hexagon/sockbits.h | 18 + > linux-user/hexagon/syscall_nr.h | 322 +++ > linux-user/hexagon/target_cpu.h | 44 + > linux-user/hexagon/target_elf.h | 40 + > linux-user/hexagon/target_fcntl.h | 18 + > linux-user/hexagon/target_signal.h | 34 + > linux-user/hexagon/target_structs.h | 46 + > linux-user/hexagon/target_syscall.h | 36 + > linux-user/hexagon/termbits.h | 18 + > linux-user/qemu.h | 2 + > linux-user/syscall_defs.h | 33 + > target/hexagon/arch.h | 35 + > target/hexagon/attribs.h | 30 + > target/hexagon/attribs_def.h | 97 + > target/hexagon/conv_emu.h | 31 + > target/hexagon/cpu-param.h | 29 + > target/hexagon/cpu.h | 159 ++ > target/hexagon/cpu_bits.h | 59 + > target/hexagon/decode.h | 32 + > target/hexagon/fma_emu.h | 37 + > target/hexagon/gen_tcg.h | 319 +++ > target/hexagon/genptr.h | 25 + > target/hexagon/helper.h | 85 + > target/hexagon/hex_arch_types.h | 38 + > target/hexagon/hex_regs.h | 83 + > target/hexagon/iclass.h | 50 + > target/hexagon/insn.h | 74 + > target/hexagon/internal.h | 39 + > target/hexagon/macros.h | 591 ++++++ > target/hexagon/opcodes.h | 63 + > target/hexagon/printinsn.h | 28 + > target/hexagon/reg_fields.h | 36 + > target/hexagon/reg_fields_def.h | 41 + > target/hexagon/translate.h | 91 + > disas/hexagon.c | 68 + > linux-user/elfload.c | 16 + > linux-user/hexagon/cpu_loop.c | 99 + > linux-user/hexagon/signal.c | 276 +++ > target/hexagon/arch.c | 294 +++ > target/hexagon/conv_emu.c | 177 ++ > target/hexagon/cpu.c | 314 +++ > target/hexagon/decode.c | 581 ++++++ > target/hexagon/fma_emu.c | 701 +++++++ > target/hexagon/gdbstub.c | 47 + > target/hexagon/gen_dectree_import.c | 187 ++ > target/hexagon/gen_semantics.c | 88 + > target/hexagon/genptr.c | 234 +++ > target/hexagon/iclass.c | 73 + > target/hexagon/op_helper.c | 1016 ++++++++++ > target/hexagon/opcodes.c | 142 ++ > target/hexagon/printinsn.c | 158 ++ > target/hexagon/q6v_decode.c | 385 ++++ > target/hexagon/reg_fields.c | 27 + > target/hexagon/translate.c | 687 +++++++ > tests/tcg/hexagon/atomics.c | 122 ++ > tests/tcg/hexagon/clrtnew.c | 56 + > tests/tcg/hexagon/dual_stores.c | 60 + > tests/tcg/hexagon/fpstuff.c | 370 ++++ > tests/tcg/hexagon/mem_noshuf.c | 328 +++ > tests/tcg/hexagon/misc.c | 360 ++++ > tests/tcg/hexagon/preg_alias.c | 106 + > tests/tcg/hexagon/pthread_cancel.c | 43 + > MAINTAINERS | 8 + > disas/meson.build | 1 + > scripts/gensyscalls.sh | 1 + > scripts/qemu-binfmt-conf.sh | 6 +- > target/hexagon/README | 235 +++ > target/hexagon/dectree.py | 351 ++++ > target/hexagon/gen_helper_funcs.py | 220 ++ > target/hexagon/gen_helper_protos.py | 150 ++ > target/hexagon/gen_op_attribs.py | 40 + > target/hexagon/gen_op_regs.py | 111 + > target/hexagon/gen_opcodes_def.py | 37 + > target/hexagon/gen_printinsn.py | 174 ++ > target/hexagon/gen_shortcode.py | 63 + > target/hexagon/gen_tcg_func_table.py | 58 + > target/hexagon/gen_tcg_funcs.py | 532 +++++ > target/hexagon/hex_common.py | 216 ++ > target/hexagon/imported/allidefs.def | 30 + > target/hexagon/imported/alu.idef | 1258 ++++++++++++ > target/hexagon/imported/branch.idef | 326 +++ > target/hexagon/imported/compare.idef | 619 ++++++ > target/hexagon/imported/encode.def | 124 ++ > target/hexagon/imported/encode_pp.def | 2110 > ++++++++++++++++++++ > target/hexagon/imported/encode_subinsn.def | 149 ++ > target/hexagon/imported/float.idef | 312 +++ > target/hexagon/imported/iclass.def | 51 + > target/hexagon/imported/ldst.idef | 286 +++ > target/hexagon/imported/macros.def | 1526 ++++++++++++++ > target/hexagon/imported/mpy.idef | 1208 +++++++++++ > target/hexagon/imported/shift.idef | 1066 ++++++++++ > target/hexagon/imported/subinsns.idef | 149 ++ > target/hexagon/imported/system.idef | 65 + > target/hexagon/meson.build | 187 ++ > target/meson.build | 1 + > tests/docker/docker.py | 12 +- > .../debian-hexagon-cross.build-toolchain.sh | 141 ++ > .../docker/dockerfiles/debian-hexagon-cross.docker | 18 + > tests/tcg/configure.sh | 8 +- > tests/tcg/hexagon/Makefile.target | 48 + > tests/tcg/hexagon/first.S | 56 + > tests/tcg/hexagon/float_convs.ref | 748 +++++++ > tests/tcg/hexagon/float_madds.ref | 768 +++++++ > 107 files changed, 23165 insertions(+), 6 deletions(-) > create mode 100644 default-configs/targets/hexagon-linux-user.mak > create mode 100644 linux-user/hexagon/sockbits.h > create mode 100644 linux-user/hexagon/syscall_nr.h > create mode 100644 linux-user/hexagon/target_cpu.h > create mode 100644 linux-user/hexagon/target_elf.h > create mode 100644 linux-user/hexagon/target_fcntl.h > create mode 100644 linux-user/hexagon/target_signal.h > create mode 100644 linux-user/hexagon/target_structs.h > create mode 100644 linux-user/hexagon/target_syscall.h > create mode 100644 linux-user/hexagon/termbits.h > create mode 100644 target/hexagon/arch.h > create mode 100644 target/hexagon/attribs.h > create mode 100644 target/hexagon/attribs_def.h > create mode 100644 target/hexagon/conv_emu.h > create mode 100644 target/hexagon/cpu-param.h > create mode 100644 target/hexagon/cpu.h > create mode 100644 target/hexagon/cpu_bits.h > create mode 100644 target/hexagon/decode.h > create mode 100644 target/hexagon/fma_emu.h > create mode 100644 target/hexagon/gen_tcg.h > create mode 100644 target/hexagon/genptr.h > create mode 100644 target/hexagon/helper.h > create mode 100644 target/hexagon/hex_arch_types.h > create mode 100644 target/hexagon/hex_regs.h > create mode 100644 target/hexagon/iclass.h > create mode 100644 target/hexagon/insn.h > create mode 100644 target/hexagon/internal.h > create mode 100644 target/hexagon/macros.h > create mode 100644 target/hexagon/opcodes.h > create mode 100644 target/hexagon/printinsn.h > create mode 100644 target/hexagon/reg_fields.h > create mode 100644 target/hexagon/reg_fields_def.h > create mode 100644 target/hexagon/translate.h > create mode 100644 disas/hexagon.c > create mode 100644 linux-user/hexagon/cpu_loop.c > create mode 100644 linux-user/hexagon/signal.c > create mode 100644 target/hexagon/arch.c > create mode 100644 target/hexagon/conv_emu.c > create mode 100644 target/hexagon/cpu.c > create mode 100644 target/hexagon/decode.c > create mode 100644 target/hexagon/fma_emu.c > create mode 100644 target/hexagon/gdbstub.c > create mode 100644 target/hexagon/gen_dectree_import.c > create mode 100644 target/hexagon/gen_semantics.c > create mode 100644 target/hexagon/genptr.c > create mode 100644 target/hexagon/iclass.c > create mode 100644 target/hexagon/op_helper.c > create mode 100644 target/hexagon/opcodes.c > create mode 100644 target/hexagon/printinsn.c > create mode 100644 target/hexagon/q6v_decode.c > create mode 100644 target/hexagon/reg_fields.c > create mode 100644 target/hexagon/translate.c > create mode 100644 tests/tcg/hexagon/atomics.c > create mode 100644 tests/tcg/hexagon/clrtnew.c > create mode 100644 tests/tcg/hexagon/dual_stores.c > create mode 100644 tests/tcg/hexagon/fpstuff.c > create mode 100644 tests/tcg/hexagon/mem_noshuf.c > create mode 100644 tests/tcg/hexagon/misc.c > create mode 100644 tests/tcg/hexagon/preg_alias.c > create mode 100644 tests/tcg/hexagon/pthread_cancel.c > create mode 100644 target/hexagon/README > create mode 100755 target/hexagon/dectree.py > create mode 100755 target/hexagon/gen_helper_funcs.py > create mode 100755 target/hexagon/gen_helper_protos.py > create mode 100755 target/hexagon/gen_op_attribs.py > create mode 100755 target/hexagon/gen_op_regs.py > create mode 100755 target/hexagon/gen_opcodes_def.py > create mode 100755 target/hexagon/gen_printinsn.py > create mode 100755 target/hexagon/gen_shortcode.py > create mode 100755 target/hexagon/gen_tcg_func_table.py > create mode 100755 target/hexagon/gen_tcg_funcs.py > create mode 100755 target/hexagon/hex_common.py > create mode 100644 target/hexagon/imported/allidefs.def > create mode 100644 target/hexagon/imported/alu.idef > create mode 100644 target/hexagon/imported/branch.idef > create mode 100644 target/hexagon/imported/compare.idef > create mode 100644 target/hexagon/imported/encode.def > create mode 100644 target/hexagon/imported/encode_pp.def > create mode 100644 target/hexagon/imported/encode_subinsn.def > create mode 100644 target/hexagon/imported/float.idef > create mode 100644 target/hexagon/imported/iclass.def > create mode 100644 target/hexagon/imported/ldst.idef > create mode 100755 target/hexagon/imported/macros.def > create mode 100644 target/hexagon/imported/mpy.idef > create mode 100644 target/hexagon/imported/shift.idef > create mode 100644 target/hexagon/imported/subinsns.idef > create mode 100644 target/hexagon/imported/system.idef > create mode 100644 target/hexagon/meson.build > create mode 100755 > tests/docker/dockerfiles/debian-hexagon-cross.build-toolchain.sh > create mode 100644 tests/docker/dockerfiles/debian-hexagon-cross.docker > create mode 100644 tests/tcg/hexagon/Makefile.target > create mode 100644 tests/tcg/hexagon/first.S > create mode 100644 tests/tcg/hexagon/float_convs.ref > create mode 100644 tests/tcg/hexagon/float_madds.ref -- Alex Bennée