This series adds support for the Hexagon processor with Linux user support See patch 02 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_v8. 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 patch in the series add docker support. Thanks to Alessandro Di Federico and Brian Cain for making this happen. The default container (debian-hexagon-cross) uses a toolchain built by rev.ng. Alternatively, there is a container that will build the toolchain locally (debian-hexagon-cross-build-local). Here are the commands to verify the code: mkdir build cd build ../configure --target-list=hexagon-linux-user make make check-tcg *** 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/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 v8 *** Address feedback from Philippe Mathieu-Daudé Make RAISE_FP_EXCEPTION conditional on CONFIG_USER_ONLY Enable build in 32-bit mode Remove extern from function prototypes in header files Fixed issues running under gitlab-ci Use qemu .inc file naming convention Address feedback from Richard Henderson < Don't set PC at the beginning of every packet Don't set slot_cancelled at the beginning of every packet Don't set pred_written at the beginning of every packet Only update execution counters at the end of TB Reduce the amount of code that gets compiled when HEX_DEBUG is off Fix bug uncovered in sanitizers-enabled build Fix bug uncovered in clang build *** Changes in v7 *** Address feedback from Philippe Mathieu-Daudé Update copyright to 2021 Use GString instead of for disassembly Remove mixed declarations (interleaving statements and declarations) Change 4 to sizeof(uint32_t) Address feedback from Alex Bennée Break TCG tests patch into multiple patches Remove pthread_cancel test (submitted as a standalone patch) *** 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 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 /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 (1): Add Dockerfile for hexagon Taylor Simpson (34): 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 - multiarch Hexagon (tests/tcg/hexagon) TCG tests - atomics/load/store/misc Hexagon (tests/tcg/hexagon) TCG tests - floating point 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 | 54 + 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 | 34 + target/hexagon/attribs.h | 35 + target/hexagon/conv_emu.h | 31 + target/hexagon/cpu-param.h | 29 + target/hexagon/cpu.h | 159 ++ target/hexagon/cpu_bits.h | 58 + target/hexagon/decode.h | 32 + target/hexagon/fma_emu.h | 36 + target/hexagon/gen_tcg.h | 319 +++ target/hexagon/genptr.h | 25 + target/hexagon/helper.h | 88 + 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 | 37 + target/hexagon/macros.h | 592 ++++++ target/hexagon/opcodes.h | 58 + target/hexagon/printinsn.h | 27 + target/hexagon/reg_fields.h | 36 + target/hexagon/translate.h | 93 + target/hexagon/attribs_def.h.inc | 97 + target/hexagon/reg_fields_def.h.inc | 41 + disas/hexagon.c | 65 + linux-user/elfload.c | 16 + linux-user/hexagon/cpu_loop.c | 100 + linux-user/hexagon/signal.c | 276 +++ target/hexagon/arch.c | 300 +++ target/hexagon/conv_emu.c | 177 ++ target/hexagon/cpu.c | 318 +++ target/hexagon/decode.c | 957 +++++++++ target/hexagon/fma_emu.c | 702 +++++++ target/hexagon/gdbstub.c | 47 + target/hexagon/gen_dectree_import.c | 188 ++ target/hexagon/gen_semantics.c | 88 + target/hexagon/genptr.c | 331 +++ target/hexagon/iclass.c | 73 + target/hexagon/op_helper.c | 1064 ++++++++++ target/hexagon/opcodes.c | 142 ++ target/hexagon/printinsn.c | 146 ++ target/hexagon/reg_fields.c | 27 + target/hexagon/translate.c | 748 +++++++ tests/tcg/hexagon/atomics.c | 139 ++ 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 | 380 ++++ tests/tcg/hexagon/preg_alias.c | 169 ++ MAINTAINERS | 9 + 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 | 39 + target/hexagon/gen_op_regs.py | 110 + target/hexagon/gen_opcodes_def.py | 36 + target/hexagon/gen_printinsn.py | 173 ++ target/hexagon/gen_shortcode.py | 60 + target/hexagon/gen_tcg_func_table.py | 58 + target/hexagon/gen_tcg_funcs.py | 485 +++++ target/hexagon/hex_common.py | 234 +++ 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 | 1531 ++++++++++++++ target/hexagon/imported/mpy.idef | 1208 +++++++++++ target/hexagon/imported/shift.idef | 1066 ++++++++++ target/hexagon/imported/subinsns.idef | 149 ++ target/hexagon/imported/system.idef | 68 + target/hexagon/meson.build | 193 ++ target/meson.build | 1 + .../debian-hexagon-cross-build-local.docker | 18 + .../debian-hexagon-cross.build-toolchain.sh | 141 ++ .../docker/dockerfiles/debian-hexagon-cross.docker | 1 + tests/tcg/configure.sh | 8 +- tests/tcg/hexagon/Makefile.target | 46 + tests/tcg/hexagon/first.S | 56 + tests/tcg/hexagon/float_convs.ref | 748 +++++++ tests/tcg/hexagon/float_madds.ref | 768 +++++++ 104 files changed, 23339 insertions(+), 2 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/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/translate.h create mode 100644 target/hexagon/attribs_def.h.inc create mode 100644 target/hexagon/reg_fields_def.h.inc 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/reg_fields.c create mode 100644 target/hexagon/translate.c create mode 100644 tests/tcg/hexagon/atomics.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 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 100644 tests/docker/dockerfiles/debian-hexagon-cross-build-local.docker 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 -- 2.7.4