Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Schimpe, Christina" <christina.schimpe@intel.com>
To: Hannes Domani <ssbssa@yahoo.de>,
	"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Subject: RE: [PATCH v2 06/11] Move x86 register code into x86-windows-nat.c
Date: Mon, 19 Jan 2026 12:50:09 +0000	[thread overview]
Message-ID: <SN7PR11MB76381435ECD6B74A38D1E423F988A@SN7PR11MB7638.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20260117134052.2660009-6-ssbssa@yahoo.de>

> -----Original Message-----
> From: Hannes Domani <ssbssa@yahoo.de>
> Sent: Samstag, 17. Januar 2026 14:36
> To: gdb-patches@sourceware.org
> Subject: [PATCH v2 06/11] Move x86 register code into x86-windows-nat.c
> 
> ---
> Changes in v2:
>   - updated comment for initialize_windows_arch() describing the ATTACHING
>     argument
> ---
>  gdb/windows-nat.c     | 144 ++----------------------------------------
>  gdb/windows-nat.h     |  29 +++++++--
>  gdb/x86-windows-nat.c | 137
> +++++++++++++++++++++++++++++++++++++++-
>  3 files changed, 163 insertions(+), 147 deletions(-)
> 
> diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index
> e1da956b125..926b85d479b 100644
> --- a/gdb/windows-nat.c
> +++ b/gdb/windows-nat.c
> @@ -57,9 +57,6 @@
>  #include "xml-support.h"
>  #include "inttypes.h"
> 
> -#include "i386-tdep.h"
> -#include "i387-tdep.h"
> -
>  #include "windows-tdep.h"
>  #include "windows-nat.h"
>  #include "complaints.h"
> @@ -389,79 +386,6 @@ windows_nat_target::delete_thread (ptid_t ptid,
> DWORD exit_code,
>      windows_process->thread_list.erase (iter);  }
> 
> -/* Fetches register number R from the given windows_thread_info,
> -   and supplies its value to the given regcache.
> -
> -   This function assumes that R is non-negative.  A failed assertion
> -   is raised if that is not true.
> -
> -   This function assumes that TH->RELOAD_CONTEXT is not set, meaning
> -   that the windows_thread_info has an up-to-date context.  A failed
> -   assertion is raised if that assumption is violated.  */
> -
> -static void
> -windows_fetch_one_register (struct regcache *regcache,
> -			    windows_thread_info *th, int r)
> -{
> -  gdb_assert (r >= 0);
> -  gdb_assert (!th->reload_context);
> -
> -  char *context_ptr = windows_process->with_context (th, [] (auto *context)
> -    {
> -      return (char *) context;
> -    });
> -
> -  char *context_offset = context_ptr + windows_process->mappings[r];
> -  struct gdbarch *gdbarch = regcache->arch ();
> -  i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
> -
> -  gdb_assert (!gdbarch_read_pc_p (gdbarch));
> -  gdb_assert (gdbarch_pc_regnum (gdbarch) >= 0);
> -  gdb_assert (!gdbarch_write_pc_p (gdbarch));
> -
> -  /* GDB treats some registers as 32-bit, where they are in fact only
> -     16 bits long.  These cases must be handled specially to avoid
> -     reading extraneous bits from the context.  */
> -  if (r == I387_FISEG_REGNUM (tdep) || windows_process-
> >segment_register_p (r))
> -    {
> -      gdb_byte bytes[4] = {};
> -      memcpy (bytes, context_offset, 2);
> -      regcache->raw_supply (r, bytes);
> -    }
> -  else if (r == I387_FOP_REGNUM (tdep))
> -    {
> -      long l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
> -      regcache->raw_supply (r, &l);
> -    }
> -  else
> -    {
> -      if (th->stopped_at_software_breakpoint
> -	  && !th->pc_adjusted
> -	  && r == gdbarch_pc_regnum (gdbarch))
> -	{
> -	  int size = register_size (gdbarch, r);
> -	  if (size == 4)
> -	    {
> -	      uint32_t value;
> -	      memcpy (&value, context_offset, size);
> -	      value -= gdbarch_decr_pc_after_break (gdbarch);
> -	      memcpy (context_offset, &value, size);
> -	    }
> -	  else
> -	    {
> -	      gdb_assert (size == 8);
> -	      uint64_t value;
> -	      memcpy (&value, context_offset, size);
> -	      value -= gdbarch_decr_pc_after_break (gdbarch);
> -	      memcpy (context_offset, &value, size);
> -	    }
> -	  /* Make sure we only rewrite the PC a single time.  */
> -	  th->pc_adjusted = true;
> -	}
> -      regcache->raw_supply (r, context_offset);
> -    }
> -}
> -
>  void
>  windows_nat_target::fetch_registers (struct regcache *regcache, int r)  { @@
> -482,51 +406,9 @@ windows_nat_target::fetch_registers (struct regcache
> *regcache, int r)
> 
>    if (r < 0)
>      for (r = 0; r < gdbarch_num_regs (regcache->arch()); r++)
> -      windows_fetch_one_register (regcache, th, r);
> -  else
> -    windows_fetch_one_register (regcache, th, r);
> -}
> -
> -/* Collect the register number R from the given regcache, and store
> -   its value into the corresponding area of the given thread's context.
> -
> -   This function assumes that R is non-negative.  A failed assertion
> -   assertion is raised if that is not true.  */
> -
> -static void
> -windows_store_one_register (const struct regcache *regcache,
> -			    windows_thread_info *th, int r)
> -{
> -  gdb_assert (r >= 0);
> -
> -  char *context_ptr = windows_process->with_context (th, [] (auto *context)
> -    {
> -      return (char *) context;
> -    });
> -
> -  struct gdbarch *gdbarch = regcache->arch ();
> -  i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
> -
> -  /* GDB treats some registers as 32-bit, where they are in fact only
> -     16 bits long.  These cases must be handled specially to avoid
> -     overwriting other registers in the context.  */
> -  if (r == I387_FISEG_REGNUM (tdep) || windows_process-
> >segment_register_p (r))
> -    {
> -      gdb_byte bytes[4];
> -      regcache->raw_collect (r, bytes);
> -      memcpy (context_ptr + windows_process->mappings[r], bytes, 2);
> -    }
> -  else if (r == I387_FOP_REGNUM (tdep))
> -    {
> -      gdb_byte bytes[4];
> -      regcache->raw_collect (r, bytes);
> -      /* The value of FOP occupies the top two bytes in the context,
> -	 so write the two low-order bytes from the cache into the
> -	 appropriate spot.  */
> -      memcpy (context_ptr + windows_process->mappings[r] + 2, bytes, 2);
> -    }
> +      fetch_one_register (regcache, th, r);
>    else
> -    regcache->raw_collect (r, context_ptr + windows_process->mappings[r]);
> +    fetch_one_register (regcache, th, r);
>  }
> 
>  /* Store a new register value into the context of the thread tied to @@ -
> 545,9 +427,9 @@ windows_nat_target::store_registers (struct regcache
> *regcache, int r)
> 
>    if (r < 0)
>      for (r = 0; r < gdbarch_num_regs (regcache->arch ()); r++)
> -      windows_store_one_register (regcache, th, r);
> +      store_one_register (regcache, th, r);
>    else
> -    windows_store_one_register (regcache, th, r);
> +    store_one_register (regcache, th, r);
>  }
> 
>  bool
> @@ -1472,7 +1354,7 @@ windows_nat_target::do_initial_windows_stuff
> (DWORD pid, bool attaching)  {
>    struct inferior *inf;
> 
> -  initialize_windows_arch ();
> +  initialize_windows_arch (attaching);
> 
>    windows_process->last_sig = GDB_SIGNAL_0;
>    windows_process->open_process_used = 0; @@ -1490,22 +1372,6 @@
> windows_nat_target::do_initial_windows_stuff (DWORD pid, bool attaching)
>    clear_proceed_status (0);
>    init_wait_for_inferior ();
> 
> -#ifdef __x86_64__
> -  windows_process->ignore_first_breakpoint
> -    = !attaching && windows_process->wow64_process;
> -
> -  if (!windows_process->wow64_process)
> -    {
> -      windows_process->mappings  = amd64_mappings;
> -      windows_process->segment_register_p =
> amd64_windows_segment_register_p;
> -    }
> -  else
> -#endif
> -    {
> -      windows_process->mappings  = i386_mappings;
> -      windows_process->segment_register_p =
> i386_windows_segment_register_p;
> -    }
> -
>    inferior_appeared (inf, pid);
>    inf->attach_flag = attaching;
> 
> diff --git a/gdb/windows-nat.h b/gdb/windows-nat.h index
> 6553052f420..df872907535 100644
> --- a/gdb/windows-nat.h
> +++ b/gdb/windows-nat.h
> @@ -83,10 +83,6 @@ struct windows_per_inferior : public
> windows_nat::windows_process_info
> 
>    const int *mappings = nullptr;
> 
> -  /* The function to use in order to determine whether a register is
> -     a segment register or not.  */
> -  segment_register_p_ftype *segment_register_p = nullptr;
> -
>    std::vector<windows_solib> solibs;
> 
>  #ifdef __CYGWIN__
> @@ -184,8 +180,9 @@ struct windows_nat_target : public inf_child_target
>  protected:
> 
>    /* Initialize arch-specific data for a new inferior (debug registers,
> -     register mappings).  */
> -  virtual void initialize_windows_arch () = 0;
> +     register mappings).  If ATTACHING is true, we're attaching to an
> +     already-running process.  */
> +  virtual void initialize_windows_arch (bool attaching) = 0;
>    /* Cleanup arch-specific data after inferior exit.  */
>    virtual void cleanup_windows_arch () = 0;
> 
> @@ -198,6 +195,26 @@ struct windows_nat_target : public inf_child_target
>    /* Set the stepping bit in the thread context.  */
>    virtual void thread_context_step (windows_thread_info *th) = 0;
> 
> +  /* Fetches register number R from the given windows_thread_info,
> +     and supplies its value to the given regcache.
> +
> +     This function assumes that R is non-negative.  A failed assertion
> +     is raised if that is not true.
> +
> +     This function assumes that TH->RELOAD_CONTEXT is not set, meaning
> +     that the windows_thread_info has an up-to-date context.  A failed
> +     assertion is raised if that assumption is violated.  */
> +  virtual void fetch_one_register (struct regcache *regcache,
> +				   windows_thread_info *th, int r) = 0;
> +
> +  /* Collect the register number R from the given regcache, and store
> +     its value into the corresponding area of the given thread's context.
> +
> +     This function assumes that R is non-negative.  A failed assertion
> +     assertion is raised if that is not true.  */
> +  virtual void store_one_register (const struct regcache *regcache,
> +				   windows_thread_info *th, int r) = 0;
> +
>  private:
> 
>    windows_thread_info *add_thread (ptid_t ptid, HANDLE h, void *tlb, diff --
> git a/gdb/x86-windows-nat.c b/gdb/x86-windows-nat.c index
> 88844e0675a..96dd61b39fb 100644
> --- a/gdb/x86-windows-nat.c
> +++ b/gdb/x86-windows-nat.c
> @@ -23,6 +23,9 @@
> 
>  #include "x86-nat.h"
> 
> +#include "i386-tdep.h"
> +#include "i387-tdep.h"
> +
>  using namespace windows_nat;
> 
>  /* If we're not using the old Cygwin header file set, define the @@ -53,17
> +56,26 @@ check (BOOL ok, const char *file, int line)  struct
> x86_windows_per_inferior : public windows_per_inferior  {
>    uintptr_t dr[8] {};
> +
> +  /* The function to use in order to determine whether a register is
> +     a segment register or not.  */
> +  segment_register_p_ftype *segment_register_p = nullptr;
>  };
> 
>  struct x86_windows_nat_target final : public
> x86_nat_target<windows_nat_target>
>  {
> -  void initialize_windows_arch () override;
> +  void initialize_windows_arch (bool attaching) override;
>    void cleanup_windows_arch () override;
> 
>    void fill_thread_context (windows_thread_info *th) override;
> 
>    void thread_context_continue (windows_thread_info *th, int killed)
> override;
>    void thread_context_step (windows_thread_info *th) override;
> +
> +  void fetch_one_register (struct regcache *regcache,
> +			   windows_thread_info *th, int r) override;
> +  void store_one_register (const struct regcache *regcache,
> +			   windows_thread_info *th, int r) override;
>  };
> 
>  /* The current process.  */
> @@ -72,9 +84,25 @@ static x86_windows_per_inferior
> x86_windows_process;
>  /* See windows-nat.h.  */
> 
>  void
> -x86_windows_nat_target::initialize_windows_arch ()
> +x86_windows_nat_target::initialize_windows_arch (bool attaching)
>  {
>    memset (x86_windows_process.dr, 0, sizeof (x86_windows_process.dr));
> +
> +#ifdef __x86_64__
> +  x86_windows_process.ignore_first_breakpoint
> +    = !attaching && x86_windows_process.wow64_process;
> +
> +  if (!x86_windows_process.wow64_process)
> +    {
> +      x86_windows_process.mappings  = amd64_mappings;
> +      x86_windows_process.segment_register_p =
> amd64_windows_segment_register_p;
> +    }
> +  else
> +#endif
> +    {
> +      x86_windows_process.mappings  = i386_mappings;
> +      x86_windows_process.segment_register_p =
> i386_windows_segment_register_p;
> +    }
>  }
> +    {
> +      x86_windows_process.mappings  = i386_mappings;
> +      x86_windows_process.segment_register_p =
> i386_windows_segment_register_p;
> +    }
> 
>  /* See windows-nat.h.  */
> @@ -158,6 +186,111 @@ x86_windows_nat_target::thread_context_step
> (windows_thread_info *th)
>      });
>  }
> 
> +/* See windows-nat.h.  */
> +
> +void
> +x86_windows_nat_target::fetch_one_register (struct regcache *regcache,
> +					    windows_thread_info *th, int r) {
> +  gdb_assert (r >= 0);
> +  gdb_assert (!th->reload_context);
> +  char *context_ptr = x86_windows_process.with_context (th, [] (auto
> *context)
> +    {
> +      return (char *) context;
> +    });
> +
> +  char *context_offset = context_ptr + x86_windows_process.mappings[r];
> + struct gdbarch *gdbarch = regcache->arch ();  i386_gdbarch_tdep *tdep
> + = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
> +
> +  gdb_assert (!gdbarch_read_pc_p (gdbarch));  gdb_assert
> + (gdbarch_pc_regnum (gdbarch) >= 0);  gdb_assert (!gdbarch_write_pc_p
> + (gdbarch));
> +
> +  /* GDB treats some registers as 32-bit, where they are in fact only
> +     16 bits long.  These cases must be handled specially to avoid
> +     reading extraneous bits from the context.  */
> +  if (r == I387_FISEG_REGNUM (tdep)
> +      || x86_windows_process.segment_register_p (r))
> +    {
> +      gdb_byte bytes[4] = {};
> +      memcpy (bytes, context_offset, 2);
> +      regcache->raw_supply (r, bytes);
> +    }
> +  else if (r == I387_FOP_REGNUM (tdep))
> +    {
> +      long l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
> +      regcache->raw_supply (r, &l);
> +    }
> +  else
> +    {
> +      if (th->stopped_at_software_breakpoint
> +	  && !th->pc_adjusted
> +	  && r == gdbarch_pc_regnum (gdbarch))
> +	{
> +	  int size = register_size (gdbarch, r);
> +	  if (size == 4)
> +	    {
> +	      uint32_t value;
> +	      memcpy (&value, context_offset, size);
> +	      value -= gdbarch_decr_pc_after_break (gdbarch);
> +	      memcpy (context_offset, &value, size);
> +	    }
> +	  else
> +	    {
> +	      gdb_assert (size == 8);
> +	      uint64_t value;
> +	      memcpy (&value, context_offset, size);
> +	      value -= gdbarch_decr_pc_after_break (gdbarch);
> +	      memcpy (context_offset, &value, size);
> +	    }
> +	  /* Make sure we only rewrite the PC a single time.  */
> +	  th->pc_adjusted = true;
> +	}
> +      regcache->raw_supply (r, context_offset);
> +    }
> +}
> +
> +/* See windows-nat.h.  */
> +
> +void
> +x86_windows_nat_target::store_one_register (const struct regcache
> *regcache,
> +					    windows_thread_info *th, int r) {
> +  gdb_assert (r >= 0);
> +
> +  char *context_ptr = x86_windows_process.with_context (th, [] (auto
> *context)
> +    {
> +      return (char *) context;
> +    });
> +
> +  struct gdbarch *gdbarch = regcache->arch ();  i386_gdbarch_tdep *tdep
> + = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
> +
> +  /* GDB treats some registers as 32-bit, where they are in fact only
> +     16 bits long.  These cases must be handled specially to avoid
> +     overwriting other registers in the context.  */
> +  if (r == I387_FISEG_REGNUM (tdep)
> +      || x86_windows_process.segment_register_p (r))
> +    {
> +      gdb_byte bytes[4];
> +      regcache->raw_collect (r, bytes);
> +      memcpy (context_ptr + x86_windows_process.mappings[r], bytes, 2);
> +    }
> +  else if (r == I387_FOP_REGNUM (tdep))
> +    {
> +      gdb_byte bytes[4];
> +      regcache->raw_collect (r, bytes);
> +      /* The value of FOP occupies the top two bytes in the context,
> +	 so write the two low-order bytes from the cache into the
> +	 appropriate spot.  */
> +      memcpy (context_ptr + x86_windows_process.mappings[r] + 2, bytes,
> 2);
> +    }
> +  else
> +    regcache->raw_collect (r, context_ptr +
> +x86_windows_process.mappings[r]); }
> +
>  /* Hardware watchpoint support, adapted from go32-nat.c code.  */
> 
>  /* Pass the address ADDR to the inferior in the I'th debug register.
> --
> 2.52.0
> 

This looks good to me, but I don't have much experience on windows. 
Due to that and because this patch also contains files which are not x86 specific,
I'll add my reviewed-by tag (and not the approved-by tag).

Reviewed-By: Christina Schimpe <christina.schimpe@intel.com>

Christina
Intel Deutschland GmbH
Registered Address: Dornacher Straße 1, 85622 Feldkirchen, Germany
Tel: +49 89 991 430, www.intel.de
Managing Directors: Harry Demas, Jeffrey Schneiderman, Yin Chong Sorrell
Chairperson of the Supervisory Board: Nicole Lau
Registered Seat: Munich
Commercial Register: Amtsgericht München HRB 186928

  reply	other threads:[~2026-01-19 12:51 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20260117134052.2660009-1-ssbssa.ref@yahoo.de>
2026-01-17 13:36 ` [PATCH v2 01/11] Remove duplicate code from windows_nat_target::resume Hannes Domani
2026-01-17 13:36   ` [PATCH v2 02/11] Simplify windows_nat_target::resume Hannes Domani
2026-01-19 13:55     ` Schimpe, Christina
2026-01-21 15:42       ` Tom Tromey
2026-01-23 19:11       ` Hannes Domani
2026-01-17 13:36   ` [PATCH v2 03/11] Move struct declarations into windows-nat.h Hannes Domani
2026-01-17 13:36   ` [PATCH v2 04/11] Create x86-windows-nat.c Hannes Domani
2026-01-21 15:38     ` Tom Tromey
2026-01-17 13:36   ` [PATCH v2 05/11] Move x86 debug registers and related code into x86-windows-nat.c Hannes Domani
2026-01-19 12:49     ` Schimpe, Christina
2026-01-20 15:49       ` Hannes Domani
2026-01-21  8:06         ` Schimpe, Christina
2026-01-23 13:17     ` [PATCH v3] " Hannes Domani
2026-01-23 18:50       ` Tom Tromey
2026-01-23 19:20         ` Hannes Domani
2026-01-23 19:56           ` Tom Tromey
2026-01-17 13:36   ` [PATCH v2 06/11] Move x86 register " Hannes Domani
2026-01-19 12:50     ` Schimpe, Christina [this message]
2026-01-17 13:36   ` [PATCH v2 07/11] Move x86 selector " Hannes Domani
2026-01-19 13:56     ` Schimpe, Christina
2026-01-17 13:36   ` [PATCH v2 08/11] Move software breakpoint recognition " Hannes Domani
2026-01-19 12:51     ` Schimpe, Christina
2026-01-21 15:43       ` Tom Tromey
2026-01-23 19:12         ` Hannes Domani
2026-01-17 13:36   ` [PATCH v2 09/11] Move auto_wide_charset gdbarch method to windows-tdep Hannes Domani
2026-01-17 13:36   ` [PATCH v2 10/11] Move setting size of long " Hannes Domani
2026-01-21 15:47     ` Tom Tromey
2026-01-17 13:54   ` [PATCH v2 04/11] Create x86-windows-nat.c Hannes Domani
2026-01-17 14:01     ` Hannes Domani
2026-01-17 14:14       ` Hannes Domani
2026-01-17 15:04       ` Simon Marchi
2026-01-17 15:15         ` Hannes Domani
2026-01-17 13:54   ` [PATCH v2 05/11] Move x86 debug registers and related code into x86-windows-nat.c Hannes Domani
2026-01-17 13:54   ` [PATCH v2 06/11] Move x86 register " Hannes Domani
2026-01-21 16:08     ` Tom Tromey
2026-01-17 13:54   ` [PATCH v2 09/11] Move auto_wide_charset gdbarch method to windows-tdep Hannes Domani
2026-01-21 15:48     ` Tom Tromey
2026-01-23 19:13       ` Hannes Domani
2026-01-17 13:54   ` [PATCH v2 10/11] Move setting size of long " Hannes Domani
2026-01-21 15:59     ` Tom Tromey
2026-01-17 13:54   ` [PATCH v2 11/11] Add aarch64-windows support Hannes Domani
2026-01-17 16:04     ` Eli Zaretskii
2026-01-21 16:18     ` Tom Tromey
2026-01-23 19:14       ` Hannes Domani

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=SN7PR11MB76381435ECD6B74A38D1E423F988A@SN7PR11MB7638.namprd11.prod.outlook.com \
    --to=christina.schimpe@intel.com \
    --cc=gdb-patches@sourceware.org \
    --cc=ssbssa@yahoo.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox