Hi Jeremy,

first of all: thank you for doing this! I had planned on investing some
time to figure out a "cheap" way to determine opcode lengths and skip
uninteresting ones, and it would invariably have been a lot hackier than
the solution you came up with, and I would probably have taken six months
to find the time to do so.

On Fri, 21 Mar 2025, Jeremy Drake via Cygwin-patches wrote:

> The second patch of this series might be a little difficult to deal
> with, but I included a diff of the changes from the upstream
> udis86-1.7.2 tarball (retrieved from
> https://downloads.sourceforge.net/udis86/udis86-1.7.2.tar.gz),
> and I'm copying it again here.

As Corinna requested, I would also suggest to split the patch into two,
one which copies udis86 verbatim, and a follow-up to make it compile in
Cygwin.

I use a similar strategy to vendor in `mimalloc` in Git for Windows, which
makes re-importing newer versions less painful.

And while I agree with you that
https://sourceforge.net/projects/udis86/files/ is unlikely to see any
updates, the original author added 84 commits in
https://github.com/vmt/udis86/compare/a4913cb77e2e...master since v1.7.2,
so there _might_ be changes in the future that might make a re-import
desirable.

As to this patch series: I am very much in favor of integrating it, even
if it does seem a bit like overkill to include a disassembler in Cygwin
(but who knows, maybe it would come in handy at some stage in case someone
really desires assembly to accompany any stackdumps?).

From my reading, the `find_fast_cwd_pointer()` logic will be eminently
easier to understand, and will be less prone to problems with new Windows
Insider versions, which I find really enticing.

If I would change a thing, it would only be to extend the loop condition
to include `&& ud_insn_mnemonic (&ud_obj) != UD_Iret`, so as to avoid
running outside the function.

I am also very excited that this adds ARM64 support!

Ciao,
Johannes

>
> diff -ur udis86-1.7.2/libudis86/decode.c udis86/decode.c
> --- udis86-1.7.2/libudis86/decode.c
> +++ udis86/decode.c
> @@ -23,8 +23,9 @@
>   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
> THIS
>   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
> -#include "udint.h"
> +#include "winsup.h"
>  #include "types.h"
> +#include "udint.h"
>  #include "decode.h"
>
>  #ifndef __UD_STANDALONE__
> @@ -204,7 +205,7 @@
>  decode_prefixes(struct ud *u)
>  {
>    int done = 0;
> -  uint8_t curr, last = 0;
> +  uint8_t curr = 0, last = 0;
>    UD_RETURN_ON_ERROR(u);
>
>    do {
> @@ -653,12 +654,12 @@
>        break;
>      case OP_F:
>        u->br_far  = 1;
> -      /* intended fall through */
> +      fallthrough;
>      case OP_M:
>        if (MODRM_MOD(modrm(u)) == 3) {
>          UDERR(u, "expected modrm.mod != 3\n");
>        }
> -      /* intended fall through */
> +      fallthrough;
>      case OP_E:
>        decode_modrm_rm(u, operand, REGCLASS_GPR, size);
>        break;
> @@ -677,7 +678,7 @@
>        if (MODRM_MOD(modrm(u)) != 3) {
>          UDERR(u, "expected modrm.mod == 3\n");
>        }
> -      /* intended fall through */
> +      fallthrough;
>      case OP_Q:
>        decode_modrm_rm(u, operand, REGCLASS_MMX, size);
>        break;
> @@ -688,7 +689,7 @@
>        if (MODRM_MOD(modrm(u)) != 3) {
>          UDERR(u, "expected modrm.mod == 3\n");
>        }
> -      /* intended fall through */
> +      fallthrough;
>      case OP_W:
>        decode_modrm_rm(u, operand, REGCLASS_XMM, size);
>        break;
> diff -ur udis86-1.7.2/libudis86/decode.h udis86/decode.h
> --- udis86-1.7.2/libudis86/decode.h
> +++ udis86/decode.h
> @@ -183,8 +183,8 @@
>    return (primary_opcode & 0x02) != 0;
>  }
>
> -extern struct ud_itab_entry ud_itab[];
> -extern struct ud_lookup_table_list_entry ud_lookup_table_list[];
> +extern const struct ud_itab_entry ud_itab[];
> +extern const struct ud_lookup_table_list_entry ud_lookup_table_list[];
>
>  #endif /* UD_DECODE_H */
>
> diff -ur udis86-1.7.2/libudis86/extern.h udis86/extern.h
> --- udis86-1.7.2/libudis86/extern.h
> +++ udis86/extern.h
> @@ -60,9 +60,11 @@
>
>  extern unsigned int ud_disassemble(struct ud*);
>
> +#ifndef __INSIDE_CYGWIN__
>  extern void ud_translate_intel(struct ud*);
>
>  extern void ud_translate_att(struct ud*);
> +#endif /* __INSIDE_CYGWIN__ */
>
>  extern const char* ud_insn_asm(const struct ud* u);
>
> @@ -82,7 +84,9 @@
>
>  extern enum ud_mnemonic_code ud_insn_mnemonic(const struct ud *u);
>
> +#ifndef __INSIDE_CYGWIN__
>  extern const char* ud_lookup_mnemonic(enum ud_mnemonic_code c);
> +#endif /* __INSIDE_CYGWIN__ */
>
>  extern void ud_set_user_opaque_data(struct ud*, void*);
>
> diff -ur udis86-1.7.2/libudis86/itab.c udis86/itab.c
> --- udis86-1.7.2/libudis86/itab.c
> +++ udis86/itab.c
> @@ -1,4 +1,5 @@
>  /* itab.c -- generated by udis86:scripts/ud_itab.py, do no edit */
> +#include "winsup.h"
>  #include "decode.h"
>
>  #define GROUP(n) (0x8000 | (n))
> @@ -5028,7 +5029,7 @@
>  };
>
>
> -struct ud_lookup_table_list_entry ud_lookup_table_list[] = {
> +const struct ud_lookup_table_list_entry ud_lookup_table_list[] = {
>      /* 000 */ { ud_itab__0, UD_TAB__OPC_TABLE, "table0" },
>      /* 001 */ { ud_itab__1, UD_TAB__OPC_MODE, "/m" },
>      /* 002 */ { ud_itab__2, UD_TAB__OPC_MODE, "/m" },
> @@ -6294,7 +6295,7 @@
>  #define O_sIv     { OP_sI,       SZ_V     }
>  #define O_sIz     { OP_sI,       SZ_Z     }
>
> -struct ud_itab_entry ud_itab[] = {
> +const struct ud_itab_entry ud_itab[] = {
>    /* 0000 */ { UD_Iinvalid, O_NONE, O_NONE, O_NONE, P_none },
>    /* 0001 */ { UD_Iadd, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
>    /* 0002 */ { UD_Iadd, O_Ev, O_Gv, O_NONE, 
> P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
> @@ -7749,6 +7750,7 @@
>  };
>
>
> +#ifndef __INSIDE_CYGWIN__
>  const char * ud_mnemonics_str[] = {
>  "invalid",
>      "3dnow",
> @@ -8399,3 +8401,4 @@
>      "movbe",
>      "crc32"
>  };
> +#endif /* __INSIDE_CYGWIN__ */
> diff -ur udis86-1.7.2/libudis86/itab.h udis86/itab.h
> --- udis86-1.7.2/libudis86/itab.h
> +++ udis86/itab.h
> @@ -673,6 +673,8 @@
>      UD_MAX_MNEMONIC_CODE
>  } UD_ATTR_PACKED;
>
> +#ifndef __INSIDE_CYGWIN__
>  extern const char * ud_mnemonics_str[];
> +#endif /* __INSIDE_CYGWIN__ */
>
>  #endif /* UD_ITAB_H */
> Only in udis86-1.7.2/libudis86/: Makefile.am
> Only in udis86-1.7.2/libudis86/: Makefile.in
> Only in udis86-1.7.2/libudis86/: syn.c
> Only in udis86-1.7.2/libudis86/: syn.h
> Only in udis86-1.7.2/libudis86/: syn-att.c
> Only in udis86-1.7.2/libudis86/: syn-intel.c
> diff -ur udis86-1.7.2/libudis86/types.h udis86/types.h
> --- udis86-1.7.2/libudis86/types.h
> +++ udis86/types.h
> @@ -36,6 +36,14 @@
>  #endif
>  #endif /* __KERNEL__ */
>
> +#ifdef __INSIDE_CYGWIN__
> +# include <inttypes.h>
> +# ifndef __UD_STANDALONE__
> +#  define __UD_STANDALONE__ 1
> +# endif
> +#endif /* __INSIDE_CYGWIN__ */
> +
> +
>  #if defined(_MSC_VER) || defined(__BORLANDC__)
>  # include <stdint.h>
>  # include <stdio.h>
> @@ -221,8 +229,8 @@
>    uint8_t   modrm;
>    uint8_t   primary_opcode;
>    void *    user_opaque_data;
> -  struct ud_itab_entry * itab_entry;
> -  struct ud_lookup_table_list_entry *le;
> +  const struct ud_itab_entry * itab_entry;
> +  const struct ud_lookup_table_list_entry *le;
>  };
>
>  /* 
> -----------------------------------------------------------------------------
> @@ -235,8 +243,10 @@
>  typedef struct ud             ud_t;
>  typedef struct ud_operand     ud_operand_t;
>
> +#ifndef __INSIDE_CYGWIN__
>  #define UD_SYN_INTEL          ud_translate_intel
>  #define UD_SYN_ATT            ud_translate_att
> +#endif /* __INSIDE_CYGWIN__ */
>  #define UD_EOI                (-1)
>  #define UD_INP_CACHE_SZ       32
>  #define UD_VENDOR_AMD         0
> diff -ur udis86-1.7.2/libudis86/udint.h udis86/udint.h
> --- udis86-1.7.2/libudis86/udint.h
> +++ udis86/udint.h
> @@ -26,9 +26,11 @@
>  #ifndef _UDINT_H_
>  #define _UDINT_H_
>
> -#ifdef HAVE_CONFIG_H
> -# include <config.h>
> -#endif /* HAVE_CONFIG_H */
> +#ifndef __INSIDE_CYGWIN__
> +# ifdef HAVE_CONFIG_H
> +#  include <config.h>
> +# endif /* HAVE_CONFIG_H */
> +#endif /* __INSIDE_CYGWIN__ */
>
>  #if defined(UD_DEBUG) && HAVE_ASSERT_H
>  # include <assert.h>
> diff -ur udis86-1.7.2/libudis86/udis86.c udis86/udis86.c
> --- udis86-1.7.2/libudis86/udis86.c
> +++ udis86/udis86.c
> @@ -24,8 +24,9 @@
>   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>
> -#include "udint.h"
> +#include "winsup.h"
>  #include "extern.h"
> +#include "udint.h"
>  #include "decode.h"
>
>  #if !defined(__UD_STANDALONE__)
> @@ -34,6 +35,10 @@
>  # endif
>  #endif /* !__UD_STANDALONE__ */
>
> +#ifdef __INSIDE_CYGWIN__
> +#define sprintf __small_sprintf
> +#endif /* __INSIDE_CYGWIN__ */
> +
>  static void ud_inp_init(struct ud *u);
>
>  /* 
> =============================================================================
> @@ -324,6 +329,7 @@
>  }
>
>
> +#ifndef __INSIDE_CYGWIN__
>  /* 
> =============================================================================
>   * ud_lookup_mnemonic
>   *    Looks up mnemonic code in the mnemonic string table.
> @@ -339,6 +345,7 @@
>      return NULL;
>    }
>  }
> +#endif /* __INSIDE_CYGWIN__ */
>
>
>  /*
>
> Jeremy Drake (4):
>   Cygwin: factor out find_fast_cwd_pointer to arch-specific file.
>   Cygwin: vendor libudis86 1.7.2
>   Cygwin: use udis86 to find fast cwd pointer on x64
>   Cygwin: add find_fast_cwd_pointer_aarch64.
>
>  winsup/cygwin/Makefile.am                     |   14 +-
>  winsup/cygwin/fastcwd_aarch64.cc              |  185 +
>  winsup/cygwin/path.cc                         |  145 +-
>  winsup/cygwin/udis86/decode.c                 | 1113 +++
>  winsup/cygwin/udis86/decode.h                 |  195 +
>  winsup/cygwin/udis86/extern.h                 |  109 +
>  winsup/cygwin/udis86/itab.c                   | 8404 +++++++++++++++++
>  winsup/cygwin/udis86/itab.h                   |  680 ++
>  winsup/cygwin/udis86/types.h                  |  260 +
>  winsup/cygwin/udis86/udint.h                  |   91 +
>  .../cygwin/udis86/udis86-modifications.diff   |  252 +
>  winsup/cygwin/udis86/udis86.c                 |  464 +
>  winsup/cygwin/x86_64/fastcwd_x86_64.cc        |  159 +
>  13 files changed, 11948 insertions(+), 123 deletions(-)
>  create mode 100644 winsup/cygwin/fastcwd_aarch64.cc
>  create mode 100644 winsup/cygwin/udis86/decode.c
>  create mode 100644 winsup/cygwin/udis86/decode.h
>  create mode 100644 winsup/cygwin/udis86/extern.h
>  create mode 100644 winsup/cygwin/udis86/itab.c
>  create mode 100644 winsup/cygwin/udis86/itab.h
>  create mode 100644 winsup/cygwin/udis86/types.h
>  create mode 100644 winsup/cygwin/udis86/udint.h
>  create mode 100644 winsup/cygwin/udis86/udis86-modifications.diff
>  create mode 100644 winsup/cygwin/udis86/udis86.c
>  create mode 100644 winsup/cygwin/x86_64/fastcwd_x86_64.cc
>
> --
> 2.48.1.windows.1
>
>

Reply via email to