Home | History | Annotate | Line # | Download | only in gdbserver
      1      1.1  christos /* Internal interfaces for the Win32 specific target code for gdbserver.
      2  1.1.1.3  christos    Copyright (C) 2007-2024 Free Software Foundation, Inc.
      3      1.1  christos 
      4      1.1  christos    This file is part of GDB.
      5      1.1  christos 
      6      1.1  christos    This program is free software; you can redistribute it and/or modify
      7      1.1  christos    it under the terms of the GNU General Public License as published by
      8      1.1  christos    the Free Software Foundation; either version 3 of the License, or
      9      1.1  christos    (at your option) any later version.
     10      1.1  christos 
     11      1.1  christos    This program is distributed in the hope that it will be useful,
     12      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14      1.1  christos    GNU General Public License for more details.
     15      1.1  christos 
     16      1.1  christos    You should have received a copy of the GNU General Public License
     17      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     18      1.1  christos 
     19      1.1  christos #ifndef GDBSERVER_WIN32_LOW_H
     20      1.1  christos #define GDBSERVER_WIN32_LOW_H
     21      1.1  christos 
     22      1.1  christos #include <windows.h>
     23      1.1  christos #include "nat/windows-nat.h"
     24      1.1  christos 
     25      1.1  christos struct target_desc;
     26      1.1  christos 
     27      1.1  christos /* The inferior's target description.  This is a global because the
     28      1.1  christos    Windows ports support neither bi-arch nor multi-process.  */
     29      1.1  christos extern const struct target_desc *win32_tdesc;
     30      1.1  christos #ifdef __x86_64__
     31      1.1  christos extern const struct target_desc *wow64_win32_tdesc;
     32      1.1  christos #endif
     33      1.1  christos 
     34      1.1  christos struct win32_target_ops
     35      1.1  christos {
     36      1.1  christos   /* Architecture-specific setup.  */
     37      1.1  christos   void (*arch_setup) (void);
     38      1.1  christos 
     39      1.1  christos   /* The number of target registers.  */
     40      1.1  christos   int (*num_regs) (void);
     41      1.1  christos 
     42      1.1  christos   /* Perform initializations on startup.  */
     43      1.1  christos   void (*initial_stuff) (void);
     44      1.1  christos 
     45      1.1  christos   /* Fetch the context from the inferior.  */
     46      1.1  christos   void (*get_thread_context) (windows_nat::windows_thread_info *th);
     47      1.1  christos 
     48      1.1  christos   /* Called just before resuming the thread.  */
     49      1.1  christos   void (*prepare_to_resume) (windows_nat::windows_thread_info *th);
     50      1.1  christos 
     51      1.1  christos   /* Called when a thread was added.  */
     52      1.1  christos   void (*thread_added) (windows_nat::windows_thread_info *th);
     53      1.1  christos 
     54      1.1  christos   /* Fetch register from gdbserver regcache data.  */
     55      1.1  christos   void (*fetch_inferior_register) (struct regcache *regcache,
     56      1.1  christos 				   windows_nat::windows_thread_info *th,
     57      1.1  christos 				   int r);
     58      1.1  christos 
     59      1.1  christos   /* Store a new register value into the thread context of TH.  */
     60      1.1  christos   void (*store_inferior_register) (struct regcache *regcache,
     61      1.1  christos 				   windows_nat::windows_thread_info *th,
     62      1.1  christos 				   int r);
     63      1.1  christos 
     64      1.1  christos   void (*single_step) (windows_nat::windows_thread_info *th);
     65      1.1  christos 
     66      1.1  christos   const unsigned char *breakpoint;
     67      1.1  christos   int breakpoint_len;
     68      1.1  christos 
     69      1.1  christos   /* Amount by which to decrement the PC after a breakpoint is
     70      1.1  christos      hit.  */
     71      1.1  christos   int decr_pc_after_break;
     72      1.1  christos 
     73      1.1  christos   /* Get the PC register from REGCACHE.  */
     74      1.1  christos   CORE_ADDR (*get_pc) (struct regcache *regcache);
     75      1.1  christos   /* Set the PC register in REGCACHE.  */
     76      1.1  christos   void (*set_pc) (struct regcache *regcache, CORE_ADDR newpc);
     77      1.1  christos 
     78      1.1  christos   /* Breakpoint/Watchpoint related functions.  See target.h for comments.  */
     79      1.1  christos   int (*supports_z_point_type) (char z_type);
     80      1.1  christos   int (*insert_point) (enum raw_bkpt_type type, CORE_ADDR addr,
     81      1.1  christos 		       int size, struct raw_breakpoint *bp);
     82      1.1  christos   int (*remove_point) (enum raw_bkpt_type type, CORE_ADDR addr,
     83      1.1  christos 		       int size, struct raw_breakpoint *bp);
     84      1.1  christos   int (*stopped_by_watchpoint) (void);
     85      1.1  christos   CORE_ADDR (*stopped_data_address) (void);
     86      1.1  christos };
     87      1.1  christos 
     88      1.1  christos extern struct win32_target_ops the_low_target;
     89      1.1  christos 
     90      1.1  christos /* Target ops definitions for a Win32 target.  */
     91      1.1  christos 
     92      1.1  christos class win32_process_target : public process_stratum_target
     93      1.1  christos {
     94      1.1  christos public:
     95      1.1  christos 
     96      1.1  christos   int create_inferior (const char *program,
     97      1.1  christos 		       const std::vector<char *> &program_args) override;
     98      1.1  christos 
     99      1.1  christos   int attach (unsigned long pid) override;
    100      1.1  christos 
    101      1.1  christos   int kill (process_info *proc) override;
    102      1.1  christos 
    103      1.1  christos   int detach (process_info *proc) override;
    104      1.1  christos 
    105      1.1  christos   void mourn (process_info *proc) override;
    106      1.1  christos 
    107      1.1  christos   void join (int pid) override;
    108      1.1  christos 
    109      1.1  christos   bool thread_alive (ptid_t pid) override;
    110      1.1  christos 
    111      1.1  christos   void resume (thread_resume *resume_info, size_t n) override;
    112      1.1  christos 
    113      1.1  christos   ptid_t wait (ptid_t ptid, target_waitstatus *status,
    114  1.1.1.2  christos 	       target_wait_flags options) override;
    115      1.1  christos 
    116      1.1  christos   void fetch_registers (regcache *regcache, int regno) override;
    117      1.1  christos 
    118      1.1  christos   void store_registers (regcache *regcache, int regno) override;
    119      1.1  christos 
    120      1.1  christos   int read_memory (CORE_ADDR memaddr, unsigned char *myaddr,
    121      1.1  christos 		   int len) override;
    122      1.1  christos 
    123      1.1  christos   int write_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
    124      1.1  christos 		    int len) override;
    125      1.1  christos 
    126      1.1  christos   void request_interrupt () override;
    127      1.1  christos 
    128      1.1  christos   bool supports_z_point_type (char z_type) override;
    129      1.1  christos 
    130      1.1  christos   int insert_point (enum raw_bkpt_type type, CORE_ADDR addr,
    131      1.1  christos 		    int size, raw_breakpoint *bp) override;
    132      1.1  christos 
    133      1.1  christos   int remove_point (enum raw_bkpt_type type, CORE_ADDR addr,
    134      1.1  christos 		    int size, raw_breakpoint *bp) override;
    135      1.1  christos 
    136      1.1  christos   bool supports_hardware_single_step () override;
    137      1.1  christos 
    138      1.1  christos   bool stopped_by_watchpoint () override;
    139      1.1  christos 
    140      1.1  christos   CORE_ADDR stopped_data_address () override;
    141      1.1  christos 
    142      1.1  christos   bool supports_qxfer_siginfo () override;
    143      1.1  christos 
    144      1.1  christos   int qxfer_siginfo (const char *annex, unsigned char *readbuf,
    145      1.1  christos 		     unsigned const char *writebuf,
    146      1.1  christos 		     CORE_ADDR offset, int len) override;
    147      1.1  christos 
    148      1.1  christos   bool supports_get_tib_address () override;
    149      1.1  christos 
    150      1.1  christos   int get_tib_address (ptid_t ptid, CORE_ADDR *addr) override;
    151      1.1  christos 
    152      1.1  christos   const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override;
    153      1.1  christos 
    154      1.1  christos   CORE_ADDR read_pc (regcache *regcache) override;
    155      1.1  christos 
    156      1.1  christos   void write_pc (regcache *regcache, CORE_ADDR pc) override;
    157      1.1  christos 
    158      1.1  christos   bool stopped_by_sw_breakpoint () override;
    159      1.1  christos 
    160      1.1  christos   bool supports_stopped_by_sw_breakpoint () override;
    161  1.1.1.2  christos 
    162  1.1.1.2  christos   const char *thread_name (ptid_t thread) override;
    163  1.1.1.2  christos 
    164  1.1.1.2  christos   bool supports_pid_to_exec_file () override
    165  1.1.1.2  christos   { return true; }
    166  1.1.1.2  christos 
    167  1.1.1.2  christos   const char *pid_to_exec_file (int pid) override;
    168  1.1.1.2  christos 
    169  1.1.1.2  christos   bool supports_disable_randomization () override
    170  1.1.1.2  christos   {
    171  1.1.1.2  christos     return windows_nat::disable_randomization_available ();
    172  1.1.1.2  christos   }
    173  1.1.1.2  christos };
    174  1.1.1.2  christos 
    175  1.1.1.2  christos struct gdbserver_windows_process : public windows_nat::windows_process_info
    176  1.1.1.2  christos {
    177  1.1.1.2  christos   windows_nat::windows_thread_info *thread_rec
    178  1.1.1.2  christos        (ptid_t ptid,
    179  1.1.1.2  christos 	windows_nat::thread_disposition_type disposition) override;
    180  1.1.1.2  christos   int handle_output_debug_string (struct target_waitstatus *ourstatus) override;
    181  1.1.1.2  christos   void handle_load_dll (const char *dll_name, LPVOID base) override;
    182  1.1.1.2  christos   void handle_unload_dll () override;
    183  1.1.1.2  christos   bool handle_access_violation (const EXCEPTION_RECORD *rec) override;
    184  1.1.1.2  christos 
    185  1.1.1.2  christos   int attaching = 0;
    186  1.1.1.2  christos 
    187  1.1.1.2  christos   /* A status that hasn't been reported to the core yet, and so
    188  1.1.1.2  christos      win32_wait should return it next, instead of fetching the next
    189  1.1.1.2  christos      debug event off the win32 API.  */
    190  1.1.1.2  christos   struct target_waitstatus cached_status;
    191  1.1.1.2  christos 
    192  1.1.1.2  christos   /* Non zero if an interrupt request is to be satisfied by suspending
    193  1.1.1.2  christos      all threads.  */
    194  1.1.1.2  christos   int soft_interrupt_requested = 0;
    195  1.1.1.2  christos 
    196  1.1.1.2  christos   /* Non zero if the inferior is stopped in a simulated breakpoint done
    197  1.1.1.2  christos      by suspending all the threads.  */
    198  1.1.1.2  christos   int faked_breakpoint = 0;
    199  1.1.1.2  christos 
    200  1.1.1.2  christos   /* True if current_process_handle needs to be closed.  */
    201  1.1.1.2  christos   bool open_process_used = false;
    202  1.1.1.2  christos 
    203  1.1.1.2  christos   /* Zero during the child initialization phase, and nonzero
    204  1.1.1.2  christos      otherwise.  */
    205  1.1.1.2  christos   int child_initialization_done = 0;
    206      1.1  christos };
    207      1.1  christos 
    208  1.1.1.2  christos /* The sole Windows process.  */
    209  1.1.1.2  christos extern gdbserver_windows_process windows_process;
    210  1.1.1.2  christos 
    211      1.1  christos /* Retrieve the context for this thread, if not already retrieved.  */
    212      1.1  christos extern void win32_require_context (windows_nat::windows_thread_info *th);
    213      1.1  christos 
    214      1.1  christos #endif /* GDBSERVER_WIN32_LOW_H */
    215