2005-01-15 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / win32-nat.c
index 27691f06729dd1e98c64851ac943000b4ee7d55d..62a3e7cda1acb68695b8c2500151c3a4d67f4311 100644 (file)
@@ -30,6 +30,7 @@
 #include "frame.h"             /* required by inferior.h */
 #include "inferior.h"
 #include "target.h"
+#include "exceptions.h"
 #include "gdbcore.h"
 #include "command.h"
 #include "completer.h"
@@ -56,9 +57,6 @@
 #include "i386-tdep.h"
 #include "i387-tdep.h"
 
-/* The ui's event loop. */
-extern int (*ui_loop_hook) (int signo);
-
 /* If we're not using the old Cygwin header file set, define the
    following which never should have been in the generic Win32 API
    headers in the first place since they were our own invention... */
@@ -89,9 +87,6 @@ static int debug_registers_used;
 #define DEBUG_MEM(x)   if (debug_memory)       printf_unfiltered x
 #define DEBUG_EXCEPT(x)        if (debug_exceptions)   printf_unfiltered x
 
-/* Forward declaration */
-extern struct target_ops child_ops;
-
 static void child_stop (void);
 static int win32_child_thread_alive (ptid_t);
 void child_kill_inferior (void);
@@ -361,15 +356,15 @@ do_child_fetch_inferior_registers (int r)
   if (r == I387_FISEG_REGNUM)
     {
       l = *((long *) context_offset) & 0xffff;
-      supply_register (r, (char *) &l);
+      regcache_raw_supply (current_regcache, r, (char *) &l);
     }
   else if (r == I387_FOP_REGNUM)
     {
       l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
-      supply_register (r, (char *) &l);
+      regcache_raw_supply (current_regcache, r, (char *) &l);
     }
   else if (r >= 0)
-    supply_register (r, context_offset);
+    regcache_raw_supply (current_regcache, r, context_offset);
   else
     {
       for (r = 0; r < NUM_REGS; r++)
@@ -395,7 +390,8 @@ do_child_store_inferior_registers (int r)
   if (!current_thread)
     /* Windows sometimes uses a non-existent thread id in its events */;
   else if (r >= 0)
-    regcache_collect (r, ((char *) &current_thread->context) + mappings[r]);
+    regcache_raw_collect (current_regcache, r,
+                         ((char *) &current_thread->context) + mappings[r]);
   else
     {
       for (r = 0; r < NUM_REGS; r++)
@@ -1420,8 +1416,8 @@ child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
        {
          int detach = 0;
 
-         if (ui_loop_hook != NULL)
-           detach = ui_loop_hook (0);
+         if (deprecated_ui_loop_hook != NULL)
+           detach = deprecated_ui_loop_hook (0);
 
          if (detach)
            child_kill_inferior ();
@@ -1444,7 +1440,7 @@ do_initial_child_stuff (DWORD pid)
     dr[i] = 0;
   current_event.dwProcessId = pid;
   memset (&current_event, 0, sizeof (current_event));
-  push_target (&child_ops);
+  push_target (&deprecated_child_ops);
   child_init_thread_list ();
   disable_breakpoints_in_shlibs (1);
   child_clear_solibs ();
@@ -1656,7 +1652,37 @@ child_detach (char *args, int from_tty)
       gdb_flush (gdb_stdout);
     }
   inferior_ptid = null_ptid;
-  unpush_target (&child_ops);
+  unpush_target (&deprecated_child_ops);
+}
+
+char *
+child_pid_to_exec_file (int pid)
+{
+  /* Try to find the process path using the Cygwin internal process list
+     pid isn't a valid pid, unfortunately.  Use current_event.dwProcessId
+     instead.  */
+  /* TODO: Also find native Windows processes using CW_GETPINFO_FULL.  */
+
+  static char path[MAX_PATH + 1];
+  char *path_ptr = NULL;
+  int cpid;
+  struct external_pinfo *pinfo;
+
+  cygwin_internal (CW_LOCK_PINFO, 1000);
+  for (cpid = 0;
+       (pinfo = (struct external_pinfo *)
+                       cygwin_internal (CW_GETPINFO, cpid | CW_NEXTPID));
+       cpid = pinfo->pid)
+    {
+      if (pinfo->dwProcessId == current_event.dwProcessId) /* Got it */
+       {
+         cygwin_conv_to_full_posix_path (pinfo->progname, path);
+         path_ptr = path; 
+         break;
+       }
+    }
+  cygwin_internal (CW_UNLOCK_PINFO);
+  return path_ptr; 
 }
 
 /* Print status information about what we're accessing.  */
@@ -1876,7 +1902,7 @@ child_mourn_inferior (void)
 {
   (void) child_continue (DBG_CONTINUE, -1);
   i386_cleanup_dregs();
-  unpush_target (&child_ops);
+  unpush_target (&deprecated_child_ops);
   generic_mourn_inferior ();
 }
 
@@ -2040,47 +2066,46 @@ child_close (int x)
                PIDGET (inferior_ptid)));
 }
 
-struct target_ops child_ops;
-
 static void
 init_child_ops (void)
 {
-  child_ops.to_shortname = "child";
-  child_ops.to_longname = "Win32 child process";
-  child_ops.to_doc = "Win32 child process (started by the \"run\" command).";
-  child_ops.to_open = child_open;
-  child_ops.to_close = child_close;
-  child_ops.to_attach = child_attach;
-  child_ops.to_detach = child_detach;
-  child_ops.to_resume = child_resume;
-  child_ops.to_wait = child_wait;
-  child_ops.to_fetch_registers = child_fetch_inferior_registers;
-  child_ops.to_store_registers = child_store_inferior_registers;
-  child_ops.to_prepare_to_store = child_prepare_to_store;
-  child_ops.to_xfer_memory = child_xfer_memory;
-  child_ops.to_files_info = child_files_info;
-  child_ops.to_insert_breakpoint = memory_insert_breakpoint;
-  child_ops.to_remove_breakpoint = memory_remove_breakpoint;
-  child_ops.to_terminal_init = terminal_init_inferior;
-  child_ops.to_terminal_inferior = terminal_inferior;
-  child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
-  child_ops.to_terminal_ours = terminal_ours;
-  child_ops.to_terminal_save_ours = terminal_save_ours;
-  child_ops.to_terminal_info = child_terminal_info;
-  child_ops.to_kill = child_kill_inferior;
-  child_ops.to_create_inferior = child_create_inferior;
-  child_ops.to_mourn_inferior = child_mourn_inferior;
-  child_ops.to_can_run = child_can_run;
-  child_ops.to_thread_alive = win32_child_thread_alive;
-  child_ops.to_pid_to_str = cygwin_pid_to_str;
-  child_ops.to_stop = child_stop;
-  child_ops.to_stratum = process_stratum;
-  child_ops.to_has_all_memory = 1;
-  child_ops.to_has_memory = 1;
-  child_ops.to_has_stack = 1;
-  child_ops.to_has_registers = 1;
-  child_ops.to_has_execution = 1;
-  child_ops.to_magic = OPS_MAGIC;
+  deprecated_child_ops.to_shortname = "child";
+  deprecated_child_ops.to_longname = "Win32 child process";
+  deprecated_child_ops.to_doc = "Win32 child process (started by the \"run\" command).";
+  deprecated_child_ops.to_open = child_open;
+  deprecated_child_ops.to_close = child_close;
+  deprecated_child_ops.to_attach = child_attach;
+  deprecated_child_ops.to_detach = child_detach;
+  deprecated_child_ops.to_resume = child_resume;
+  deprecated_child_ops.to_wait = child_wait;
+  deprecated_child_ops.to_fetch_registers = child_fetch_inferior_registers;
+  deprecated_child_ops.to_store_registers = child_store_inferior_registers;
+  deprecated_child_ops.to_prepare_to_store = child_prepare_to_store;
+  deprecated_child_ops.deprecated_xfer_memory = child_xfer_memory;
+  deprecated_child_ops.to_files_info = child_files_info;
+  deprecated_child_ops.to_insert_breakpoint = memory_insert_breakpoint;
+  deprecated_child_ops.to_remove_breakpoint = memory_remove_breakpoint;
+  deprecated_child_ops.to_terminal_init = terminal_init_inferior;
+  deprecated_child_ops.to_terminal_inferior = terminal_inferior;
+  deprecated_child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
+  deprecated_child_ops.to_terminal_ours = terminal_ours;
+  deprecated_child_ops.to_terminal_save_ours = terminal_save_ours;
+  deprecated_child_ops.to_terminal_info = child_terminal_info;
+  deprecated_child_ops.to_kill = child_kill_inferior;
+  deprecated_child_ops.to_create_inferior = child_create_inferior;
+  deprecated_child_ops.to_mourn_inferior = child_mourn_inferior;
+  deprecated_child_ops.to_can_run = child_can_run;
+  deprecated_child_ops.to_thread_alive = win32_child_thread_alive;
+  deprecated_child_ops.to_pid_to_str = cygwin_pid_to_str;
+  deprecated_child_ops.to_stop = child_stop;
+  deprecated_child_ops.to_stratum = process_stratum;
+  deprecated_child_ops.to_has_all_memory = 1;
+  deprecated_child_ops.to_has_memory = 1;
+  deprecated_child_ops.to_has_stack = 1;
+  deprecated_child_ops.to_has_registers = 1;
+  deprecated_child_ops.to_has_execution = 1;
+  deprecated_child_ops.to_magic = OPS_MAGIC;
+  deprecated_child_ops.to_pid_to_exec_file = child_pid_to_exec_file;
 }
 
 void
@@ -2096,47 +2121,54 @@ _initialize_win32_nat (void)
 
   add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
 
-  add_show_from_set (add_set_cmd ("shell", class_support, var_boolean,
-                                 (char *) &useshell,
-                "Set use of shell to start subprocess.",
-                                 &setlist),
-                    &showlist);
-
-  add_show_from_set (add_set_cmd ("new-console", class_support, var_boolean,
-                                 (char *) &new_console,
-                "Set creation of new console when creating child process.",
-                                 &setlist),
-                    &showlist);
-
-  add_show_from_set (add_set_cmd ("new-group", class_support, var_boolean,
-                                 (char *) &new_group,
-                  "Set creation of new group when creating child process.",
-                                 &setlist),
-                    &showlist);
-
-  add_show_from_set (add_set_cmd ("debugexec", class_support, var_boolean,
-                                 (char *) &debug_exec,
-                      "Set whether to display execution in child process.",
-                                 &setlist),
-                    &showlist);
-
-  add_show_from_set (add_set_cmd ("debugevents", class_support, var_boolean,
-                                 (char *) &debug_events,
-                  "Set whether to display kernel events in child process.",
-                                 &setlist),
-                    &showlist);
-
-  add_show_from_set (add_set_cmd ("debugmemory", class_support, var_boolean,
-                                 (char *) &debug_memory,
-                "Set whether to display memory accesses in child process.",
-                                 &setlist),
-                    &showlist);
-
-  add_show_from_set (add_set_cmd ("debugexceptions", class_support, var_boolean,
-                                 (char *) &debug_exceptions,
-              "Set whether to display kernel exceptions in child process.",
-                                 &setlist),
-                    &showlist);
+  deprecated_add_show_from_set
+    (add_set_cmd ("shell", class_support, var_boolean,
+                 (char *) &useshell,
+                 "Set use of shell to start subprocess.",
+                 &setlist),
+     &showlist);
+
+  deprecated_add_show_from_set
+    (add_set_cmd ("new-console", class_support, var_boolean,
+                 (char *) &new_console,
+                 "Set creation of new console when creating child process.",
+                 &setlist),
+     &showlist);
+
+  deprecated_add_show_from_set
+    (add_set_cmd ("new-group", class_support, var_boolean,
+                 (char *) &new_group,
+                 "Set creation of new group when creating child process.",
+                 &setlist),
+     &showlist);
+
+  deprecated_add_show_from_set
+    (add_set_cmd ("debugexec", class_support, var_boolean,
+                 (char *) &debug_exec,
+                 "Set whether to display execution in child process.",
+                 &setlist),
+     &showlist);
+
+  deprecated_add_show_from_set
+    (add_set_cmd ("debugevents", class_support, var_boolean,
+                 (char *) &debug_events,
+                 "Set whether to display kernel events in child process.",
+                 &setlist),
+     &showlist);
+
+  deprecated_add_show_from_set
+    (add_set_cmd ("debugmemory", class_support, var_boolean,
+                 (char *) &debug_memory,
+                 "Set whether to display memory accesses in child process.",
+                 &setlist),
+     &showlist);
+
+  deprecated_add_show_from_set
+    (add_set_cmd ("debugexceptions", class_support, var_boolean,
+                 (char *) &debug_exceptions,
+                 "Set whether to display kernel exceptions in child process.",
+                 &setlist),
+     &showlist);
 
   add_info ("dll", info_dll_command, "Status of loaded DLLs.");
   add_info_alias ("sharedlibrary", "dll", 1);
@@ -2149,7 +2181,7 @@ _initialize_win32_nat (void)
           "Display selectors infos.",
           &info_w32_cmdlist);
 
-  add_target (&child_ops);
+  add_target (&deprecated_child_ops);
 }
 
 /* Hardware watchpoint support, adapted from go32-nat.c code.  */
@@ -2239,65 +2271,65 @@ core_dll_symbols_add (char *dll_name, DWORD base_addr)
       }
   }
 
-    register_loaded_dll (dll_name, base_addr + 0x1000);
-    solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000);
+  register_loaded_dll (dll_name, base_addr + 0x1000);
+  solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000);
 
 out:
-    return 1;
-  }
+ out:
+  return 1;
+}
 
-  typedef struct
-  {
-    struct target_ops *target;
-    bfd_vma addr;
-  } map_code_section_args;
+typedef struct
+{
+  struct target_ops *target;
+  bfd_vma addr;
+} map_code_section_args;
 
-  static void
-  map_single_dll_code_section (bfd * abfd, asection * sect, void *obj)
-  {
-    int old;
-    int update_coreops;
-    struct section_table *new_target_sect_ptr;
+static void
+map_single_dll_code_section (bfd * abfd, asection * sect, void *obj)
+{
+  int old;
+  int update_coreops;
+  struct section_table *new_target_sect_ptr;
 
-    map_code_section_args *args = (map_code_section_args *) obj;
-    struct target_ops *target = args->target;
-    if (sect->flags & SEC_CODE)
-      {
-       update_coreops = core_ops.to_sections == target->to_sections;
+  map_code_section_args *args = (map_code_section_args *) obj;
+  struct target_ops *target = args->target;
+  if (sect->flags & SEC_CODE)
+    {
+      update_coreops = core_ops.to_sections == target->to_sections;
 
-       if (target->to_sections)
-         {
-           old = target->to_sections_end - target->to_sections;
-           target->to_sections = (struct section_table *)
-             xrealloc ((char *) target->to_sections,
-                       (sizeof (struct section_table)) * (1 + old));
-         }
-       else
-         {
-           old = 0;
-           target->to_sections = (struct section_table *)
-             xmalloc ((sizeof (struct section_table)));
-         }
-       target->to_sections_end = target->to_sections + (1 + old);
+      if (target->to_sections)
+       {
+         old = target->to_sections_end - target->to_sections;
+         target->to_sections = (struct section_table *)
+           xrealloc ((char *) target->to_sections,
+                     (sizeof (struct section_table)) * (1 + old));
+       }
+      else
+       {
+         old = 0;
+         target->to_sections = (struct section_table *)
+           xmalloc ((sizeof (struct section_table)));
+       }
+      target->to_sections_end = target->to_sections + (1 + old);
 
-       /* Update the to_sections field in the core_ops structure
-          if needed.  */
-       if (update_coreops)
-         {
-           core_ops.to_sections = target->to_sections;
-           core_ops.to_sections_end = target->to_sections_end;
-         }
-       new_target_sect_ptr = target->to_sections + old;
-       new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
-       new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
-         bfd_section_size (abfd, sect);;
-       new_target_sect_ptr->the_bfd_section = sect;
-       new_target_sect_ptr->bfd = abfd;
-      }
-  }
+      /* Update the to_sections field in the core_ops structure
+        if needed.  */
+      if (update_coreops)
+       {
+         core_ops.to_sections = target->to_sections;
+         core_ops.to_sections_end = target->to_sections_end;
+       }
+      new_target_sect_ptr = target->to_sections + old;
+      new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
+      new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
+       bfd_section_size (abfd, sect);;
+      new_target_sect_ptr->the_bfd_section = sect;
+      new_target_sect_ptr->bfd = abfd;
+    }
+}
 
-  static int
-  dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
+static int
+dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
 {
   bfd *dll_bfd;
   map_code_section_args map_args;
@@ -2413,7 +2445,7 @@ fetch_elf_core_registers (char *core_reg_sect,
       return;
     }
   for (r = 0; r < NUM_REGS; r++)
-    supply_register (r, core_reg_sect + mappings[r]);
+    regcache_raw_supply (current_regcache, r, core_reg_sect + mappings[r]);
 }
 
 static struct core_fns win32_elf_core_fns =
This page took 0.030448 seconds and 4 git commands to generate.