[binutils-gdb] Windows gdbserver: Eliminate soft-interrupt mechanism

Pedro Alves via Gdb-cvs <[email protected]>
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7e1178a6e5e9c51e98ff0f64804621409db4578d

commit 7e1178a6e5e9c51e98ff0f64804621409db4578d
Author: Pedro Alves <[email protected]>
Date:   Thu May 11 18:41:27 2023 +0100

    Windows gdbserver: Eliminate soft-interrupt mechanism
    
    I noticed that faked_breakpoint is write only.  And then I hacked
    win32_process_target::request_interrupt to force it to stop threads
    using the soft_interrupt_requested mechanism (which suspends threads,
    and then fakes a breakpoint event in the main thread), and saw that it
    no longer works -- gdbserver crashes accessing a NULL current_thread,
    because fake_breakpoint_event does not switch to a thread.
    
    This code was originally added for Windows CE, as neither
    GenerateConsoleCtrlEvent nor DebugBreakProcess worked there.  Windows
    CE support has since been removed.
    
    We nowadays require Windows XP or later, and XP has DebugBreakProcess.
    
    The soft_interrupt_requested mechanism has other problems, like for
    example faking the event in the main thread, even if that thread was
    previously stopped, due to scheduler-locking.
    
    A following patch will add a similar mechanism stopping all threads
    with SuspendThread to native GDB, for non-stop mode, which doesn't
    have these problems.  It's different enough from this old code that I
    think we should just rip the old code out, and reimplement it from
    scratch (based on gdb's version) when we need it.
    
    Approved-By: Tom Tromey <[email protected]>
    Change-Id: I89e98233a9c40c6dcba7c8e1dacee08603843fb1

Diff:
---
 gdbserver/win32-low.cc | 39 +--------------------------------------
 gdbserver/win32-low.h  |  8 --------
 2 files changed, 1 insertion(+), 46 deletions(-)

diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc
index be01940d158..5caec960082 100644
--- a/gdbserver/win32-low.cc
+++ b/gdbserver/win32-low.cc
@@ -289,8 +289,6 @@ do_initial_child_stuff (HANDLE proch, DWORD pid, int attached)
   windows_process.process_id = pid;
   windows_process.main_thread_id = 0;
 
-  windows_process.soft_interrupt_requested = 0;
-  windows_process.faked_breakpoint = 0;
   windows_process.open_process_used = true;
 
   memset (&windows_process.current_event, 0,
@@ -407,7 +405,6 @@ child_continue_for_kill (DWORD continue_status, int thread_id)
     {
       continue_one_thread (thread, thread_id);
     });
-  windows_process.faked_breakpoint = 0;
 
   return continue_last_debug_event (continue_status, debug_threads);
 }
@@ -907,30 +904,6 @@ suspend_one_thread (thread_info *thread)
   th->suspend ();
 }
 
-static void
-fake_breakpoint_event (void)
-{
-  OUTMSG2(("fake_breakpoint_event\n"));
-
-  windows_process.faked_breakpoint = 1;
-
-  memset (&windows_process.current_event, 0,
-	  sizeof (windows_process.current_event));
-  windows_process.current_event.dwThreadId = windows_process.main_thread_id;
-  windows_process.current_event.dwDebugEventCode = EXCEPTION_DEBUG_EVENT;
-  windows_process.current_event.u.Exception.ExceptionRecord.ExceptionCode
-    = EXCEPTION_BREAKPOINT;
-
-  /* On aarch64, hardware breakpoints also get EXCEPTION_BREAKPOINT,
-     but they can be recognized with ExceptionInformation.  */
-  windows_process.current_event.u.Exception.ExceptionRecord.NumberParameters
-    = 1;
-  windows_process.current_event.u.Exception.ExceptionRecord
-    .ExceptionInformation[0] = 0;
-
-  for_each_thread (suspend_one_thread);
-}
-
 /* See nat/windows-nat.h.  */
 
 bool
@@ -983,13 +956,6 @@ get_child_debug_event (DWORD *continue_status,
 
   DEBUG_EVENT *current_event = &windows_process.current_event;
 
-  if (windows_process.soft_interrupt_requested)
-    {
-      windows_process.soft_interrupt_requested = 0;
-      fake_breakpoint_event ();
-      goto gotevent;
-    }
-
   windows_process.attaching = 0;
   {
     process_info *proc = find_process_pid (windows_process.process_id);
@@ -1030,8 +996,6 @@ get_child_debug_event (DWORD *continue_status,
       }
   }
 
- gotevent:
-
   switch (current_event->dwDebugEventCode)
     {
     case CREATE_THREAD_DEBUG_EVENT:
@@ -1285,8 +1249,7 @@ win32_process_target::request_interrupt ()
   if (DebugBreakProcess (windows_process.handle))
     return;
 
-  /* Last resort, suspend all threads manually.  */
-  windows_process.soft_interrupt_requested = 1;
+  OUTMSG2 (("Could not interrupt.\n"));
 }
 
 bool
diff --git a/gdbserver/win32-low.h b/gdbserver/win32-low.h
index 402254fdad5..9c672bfce1a 100644
--- a/gdbserver/win32-low.h
+++ b/gdbserver/win32-low.h
@@ -191,14 +191,6 @@ struct gdbserver_windows_process : public windows_nat::windows_process_info
      debug event off the win32 API.  */
   struct target_waitstatus cached_status;
 
-  /* Non zero if an interrupt request is to be satisfied by suspending
-     all threads.  */
-  int soft_interrupt_requested = 0;
-
-  /* Non zero if the inferior is stopped in a simulated breakpoint done
-     by suspending all the threads.  */
-  int faked_breakpoint = 0;
-
   /* True if current_process_handle needs to be closed.  */
   bool open_process_used = false;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.