Skip to content
Snippets Groups Projects
  1. Mar 15, 2023
  2. Feb 28, 2023
  3. Feb 27, 2023
  4. Feb 25, 2023
    • Andrew Burgess's avatar
      opcodes/m68k: enable libopcodes styling for GDB · 82341e97
      Andrew Burgess authored
      The following commit added libopcodes styling for m68k:
      
        commit c22ff449
        Date:   Tue Feb 14 18:07:19 2023 +0100
      
            opcodes: style m68k disassembler output
      
      but didn't set disassemble_info::created_styled_output in
      disassemble.c, which is needed in order for GDB to start using the
      libopcodes based styling.
      
      This commit fixes this small oversight.  GDB now styles correctly.
      82341e97
  5. Feb 24, 2023
    • Jan Beulich's avatar
      x86: MONITOR/MWAIT are not SSE3 insns · cafa5ef7
      Jan Beulich authored
      These have their own CPUID bit and hence they should also have their own
      separate control.
      cafa5ef7
    • Jan Beulich's avatar
      x86-64: don't permit LAHF/SAHF with "generic64" · c3bb24f5
      Jan Beulich authored
      The feature isn't universally available on 64-bit CPUs.
      
      Note that in i386-gen.c:isa_dependencies[] I'm only adding it to models
      where I'm certain the functionality exists. For Nocona and Core I'm
      uncertain in particular.
      c3bb24f5
    • Jan Beulich's avatar
      x86: have insns acting on segment selector values allow for consistent operands · 5eeeafe0
      Jan Beulich authored
      While MOV to/from segment register as well as selector storing insns
      already permit 32- and 64-bit GPR operands, selector loading insns and
      ARPL do not. Split templates accordingly.
      5eeeafe0
    • Jan Beulich's avatar
      x86: restrict insn templates accepting negative 8-bit immediates · c34d1cc9
      Jan Beulich authored
      For shifts (but not ordinary rotates) and other cases where an immediate
      describes e.g. a bit count or position, allowing negative operands is at
      best confusing. An extreme example would be the two rotate-through-carry
      insns, where a negative value would _not_ mean rotating the
      corresponding number of bits in the other direction. To refuse such,
      give meaning to the combination of Imm8 and Imm8S in templates (so far
      these weren't used together anywhere). The issue was with
      smallest_imm_type() blindly setting .imm8 for signed numbers determined
      to fit in a byte.
      
      VPROT{B,W,D,Q} is a little special: The rotate count there is a signed
      quantity, so Imm8 is replaced by Imm8S. Adjust affected testcases
      accordingly as well.
      
      Another small adjustment to the testsuite is necessary: AAM and AAD were
      never sensible to use with 0xffffff90 operands. This should have been an
      error.
      c34d1cc9
  6. Feb 22, 2023
    • Jan Beulich's avatar
      x86-64: LAR and LSL don't need REX.W · ba25141c
      Jan Beulich authored
      Just like we suppress emitting REX.W for e.g. MOV from/to segment
      register, there's also no need for it for LAR and LSL - these can only
      ever return 32-bit values and hence always zero-extend their results
      anyway.
      
      While there also drop the redundant Word from the first operand of
      the second template each - this is already implied by Reg16.
      ba25141c
    • Jan Beulich's avatar
      x86: optimize BT{,C,R,S} $imm,%reg · ad2f4436
      Jan Beulich authored
      In 64-bit mode BT can have REX.W or a data size prefix dropped in
      certain cases. Outside of 64-bit mode all 4 insns can have the data
      size prefix dropped in certain cases.
      ad2f4436
  7. Feb 20, 2023
  8. Feb 14, 2023
  9. Feb 13, 2023
    • Michael Matz's avatar
      PR30120: fix x87 fucomp misassembled · 25a0d393
      Michael Matz authored
      this fixes the entry for 'fucomp' to use the correct Reg value
      (otherwise it's assembled as 'fucom').
      25a0d393
    • Andrew Burgess's avatar
      opcodes/mips: disassemble unknown micromips instructions as two shorts · 77be7257
      Andrew Burgess authored
      Before commit:
      
        commit 2438b771
        Date:   Wed Nov 2 15:53:43 2022 +0000
      
            opcodes/mips: use .word/.short for undefined instructions
      
      unknown 32-bit microMIPS instructions were disassembled as a raw
      32-bit number with no '.word' directive.  The above commit changed
      this and added a '.word' directive before the 32-bit number.
      
      It was pointed out on the mailing list, that for microMIPS it would be
      better to display such 32-bit instructions using a '.short' directive
      followed by two 16-bit values.
      
      This commit updates the mips disassembler to do this, and adds a new
      test that validates this output.
      77be7257
  10. Feb 10, 2023
    • Jan Beulich's avatar
      x86: drop use of VEX3SOURCES · aa180741
      Jan Beulich authored
      The attribute really specifies that the sum of register and memory
      operands is 4. Express it like that in most places, while using the 2nd
      (apart from XOP) CPU feature flags (FMA4) in reversed operand matching
      logic.
      
      With the use in build_modrm_byte() gone, part of an assertion there
      also becomes meaningless - simplify that at the same time.
      
      With all uses of the opcode modifier field gone, also drop that.
      aa180741
    • Jan Beulich's avatar
      x86: drop use of XOP2SOURCES · 5dab1799
      Jan Beulich authored
      The few XOP insns which used it wrongly didn't have VexVVVV specified.
      With that added, the only further missing piece to use more generic code
      elsewhere is SwapSources - see e.g. the BMI2 insns for similar operand
      patterns.
      
      With the only users gone, drop the #define as well as the special case
      code.
      5dab1799
    • Jan Beulich's avatar
      x86: limit use of XOP2SOURCES · ba3ffa6d
      Jan Beulich authored
      The VPROT* forms with an immediate operand are entirely standard in the
      way their ModR/M bytes are built. There's no reason to invoke special
      case code. With that the handling of an immediate there can also be
      dropped; it was partially bogus anyway, as in its "no memory operands"
      portion it ignores the possibility of an immediate operand (which was
      okay only because that case was already handled by more generic code).
      ba3ffa6d
    • Jan Beulich's avatar
      x86: move (and rename) opcodespace attribute · ddb62495
      Jan Beulich authored
      This really isn't a "modifier" and rather ought to live next to the base
      opcode anyway. Use the bits we presently have available to fit in the
      field, renaming it to opcode_space. As an intended side effect this
      helps readability at the use sites, by shortening the references quite a
      bit.
      
      In generated code arrange for human readable output, by using the
      SPACE_* constants there rather than raw numbers. This may aid debugging
      down the road.
      ddb62495
  11. Feb 03, 2023
    • Guillermo E. Martinez's avatar
      bpf: fix error conversion from long unsigned int to unsigned int [-Werror=overflow] · 7f6ebecd
      Guillermo E. Martinez authored
      Regenerating BPF target using the maintainer mode emits:
      .../opcodes/bpf-opc.c:57:11: error: conversion from ‘long unsigned int’ to ‘unsigned int’ changes value from ‘18446744073709486335’ to ‘4294902015’ [-Werror=overflow]
        57 |   64, 64, 0xffffffffffff00ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
      
      The use of a narrow size to handle the mask CGEN in instruction format
      is causing this error.  Additionally eBPF `call' instructions
      constructed by expressions using symbols (BPF_PSEUDO_CALL) emits
      annotations in `src' field of the instruction, used to identify BPF
      target endianness.
      
      cpu/
      	* bpf.cpu (define-call-insn): Remove `src' field from
      	instruction mask.
      
      include/
      	*opcode/cge.h (CGEN_IFMT): Adjust mask bit width.
      
      opcodes/
      	* bpf-opc.c: Regenerate.
      7f6ebecd
    • Jan Beulich's avatar
      RISC-V: don't disassemble unrecognized insns as .byte · 0655669b
      Jan Beulich authored
      Insn width granularity being 16 bits, producing byte granular output
      isn't very useful. With there being a way to specific otherwise
      unknown insns to the assembler, use that same representation (to be
      precise: its <length>,<encoding> flavor) for disassembly.
      0655669b
  12. Jan 31, 2023
    • Jan Beulich's avatar
      RISC-V: make C-extension JAL available again for (32-bit) assembly · a3c2d248
      Jan Beulich authored
      Along with the normal JAL alias, the C-extension one should have been
      moved as well by 839189bc ("RISC-V: re-arrange opcode table for
      consistent alias handling"), for the assembler to actually be able to
      use it where/when possible.
      
      Since neither this nor any other compressed branch insn was being tested
      so far, take the opportunity and introduce a new testcase covering those.
      a3c2d248
  13. Jan 27, 2023
  14. Jan 20, 2023
    • Jan Beulich's avatar
      x86: split i386-gen's opcode hash entry struct · a2e2f5ad
      Jan Beulich authored
      All glibc malloc() implementations I've checked have a smallest
      allocation size worth of 3 pointers, with an increment worth of 2
      pointers. Hence mnemonics with multiple templates can be stored more
      efficiently when maintaining the shared "name" field only in the actual
      hash entry. (To express the shared nature, also convert "name" to by
      pointer-to-const.)
      
      While doing the conversation also pull out common code from the involved
      if/else construct in expand_templates().
      a2e2f5ad
    • Jan Beulich's avatar
      x86: embed register and alike names in disassembler · 2d9e0890
      Jan Beulich authored
      Register names are (including their nul terminators) on average almost 4
      bytes long. Otoh no register name is longer than 8 bytes. Hence even for
      32-bit builds using a pointer is only slightly more space efficient than
      embedding the strings. A level of indirection can be also avoided by
      embedding the names as an array of 8 characters directly in the arrays,
      and the number of base relocations in libopcodes.so (or PIE builds of
      statically linked executables) goes down as well.
      
      To amortize for the otherwise reduced folding of string literals by the
      linker, use att_names_seg[] in place of string literals in append_seg()
      and OP_ESreg().
      2d9e0890
    • Jan Beulich's avatar
      x86: embed register names in reg_entry · edf77258
      Jan Beulich authored
      Register names are (including their nul terminators) on average almost 4
      bytes long. Otoh no register name is longer than 7 bytes. Hence even for
      32-bit builds using a pointer is only slightly more space efficient than
      embedding the strings. A level of indirection can be also avoided by
      embedding the names as an array of 8 characters directly in the struct,
      and the number of base relocations in PIE builds of gas goes down as
      well.
      edf77258
    • Jan Beulich's avatar
      x86: absorb allocation in i386-gen · 992dd393
      Jan Beulich authored
      When generating the mnemonic string table we already set up an
      identifier for the following entry in a number of cases. Re-use that on
      the next loop iteration rather than re-doing allocation and conversion.
      992dd393
    • Jan Beulich's avatar
      x86: re-use insn mnemonic strings as much as possible · 3e451ee4
      Jan Beulich authored
      Compact the mnemonic string table such that the tails of longer
      mnemonics are re-used for shorter ones, going beyond what compilers
      would typically do, but matching what ELF linkers may do when processing
      SHF_MERGE|SHF_STRINGS sections. This reduces table size by about 12.5%.
      3e451ee4
    • Jan Beulich's avatar
      x86: move insn mnemonics to a separate table · 5c139202
      Jan Beulich authored
      Using full pointers to reference the insn mnemonic strings is not very
      efficient. With overall string size presently just slightly over 20k,
      even a 16-bit value would suffice. Use "unsigned int" for now, as
      there's no good use we could presently make of the otherwise saved 16
      bits.
      
      For 64-bit builds this reduces table size by 6.25% (prior to the recent
      ISA extension additions it would have been 12.5%), with a similar effect
      on cache occupation of table entries accessed. For PIE builds of gas
      this also reduces the number of base relocations quite a bit (obviously
      independent of bitness).
      5c139202
  15. Jan 03, 2023
  16. Jan 01, 2023
  17. Dec 31, 2022
  18. Dec 22, 2022
    • Jan Beulich's avatar
      x86: correct/improve TSX controls · 760ab3d0
      Jan Beulich authored
      TSXLDTRK takes RTM as a prereq. Additionally introduce an umbrella "tsx"
      extension option covering both RTM and HLE, paralleling the "abm" one we
      already have.
      760ab3d0
    • Jan Beulich's avatar
      x86: add dependencies on SVME · 0919e770
      Jan Beulich authored
      SEV-ES is an extension to SVME. SNP in turn is an extension to SEV-ES,
      and yet in turn RMPQUERY is a SNP extension.
      
      Note that cpu_arch[] has no SNP entry, so CPU_ANY_SNP_FLAGS remains
      unused (just like CPU_SNP_FLAGS already is).
      0919e770
    • Jan Beulich's avatar
      x86: add dependencies on VMX · 25626f79
      Jan Beulich authored
      Both EPT and VMFUNC are extensions to VMX.
      25626f79
Loading