[PATCH 0/4] find_fast_cwd_pointer rewrite
Johannes Schindelin
Johannes.Schindelin@gmx.de
Wed Mar 26 17:18:12 GMT 2025
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
>
>
More information about the Cygwin-patches
mailing list