2002-02-18 Pierre Muller <muller@ics.u-strasbg.fr>
authorPierre Muller <muller@sourceware.org>
Tue, 19 Feb 2002 08:49:42 +0000 (08:49 +0000)
committerPierre Muller <muller@sourceware.org>
Tue, 19 Feb 2002 08:49:42 +0000 (08:49 +0000)
* win32-nat.c (display_selector): New function. Displays information
about the information returned by GetThreadSelectorEntry API function.
(display_selectors): New function. Displays the infomation of
the selector given as argument, or of CS, DS ans FS selectors
if no argument is given.
( _initialize_inftarg): Add "w32" as info prefix command.
Add "info w32 selector" as command calling display_selectors.

gdb/ChangeLog
gdb/win32-nat.c
gdb/windows-nat.c

index 865ac7c..9c78e68 100644 (file)
@@ -1,3 +1,13 @@
+2002-02-18  Pierre Muller  <muller@ics.u-strasbg.fr>
+
+       * win32-nat.c (display_selector): New function. Displays information
+       about the information returned by GetThreadSelectorEntry API function.
+       (display_selectors): New function. Displays the infomation of
+       the selector given as argument, or of CS, DS ans FS selectors
+       if no argument is given.
+       ( _initialize_inftarg): Add "w32" as info prefix command.
+       Add "info w32 selector" as command calling display_selectors.
+
 2002-02-19  Pierre Muller  <muller@ics.u-strasbg.fr>
 
        * i386-tdep.c (get_longjmp_target): Fix compilation failure
index 2f7e8cc..610af6f 100644 (file)
@@ -820,6 +820,126 @@ handle_output_debug_string (struct target_waitstatus *ourstatus)
   return gotasig;
 }
 
+static int
+display_selector (HANDLE thread, DWORD sel)
+{
+  LDT_ENTRY info;
+  if (GetThreadSelectorEntry (thread, sel, &info))
+    {
+      int base, limit;
+      printf_filtered ("0x%03lx: ", sel);
+      if (!info.HighWord.Bits.Pres)
+        {
+          puts_filtered ("Segment not present\n");
+          return 0;
+        }
+      base = (info.HighWord.Bits.BaseHi << 24) +
+            (info.HighWord.Bits.BaseMid << 16)
+            + info.BaseLow;
+      limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
+      if (info.HighWord.Bits.Granularity)
+       limit = (limit << 12) | 0xfff;
+      printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
+      if (info.HighWord.Bits.Default_Big)
+        puts_filtered(" 32-bit ");
+      else
+        puts_filtered(" 16-bit ");
+      switch ((info.HighWord.Bits.Type & 0xf) >> 1)
+       {
+       case 0:
+          puts_filtered ("Data (Read-Only, Exp-up");
+          break;
+       case 1:
+          puts_filtered ("Data (Read/Write, Exp-up");
+          break;
+       case 2:
+          puts_filtered ("Unused segment (");
+          break;
+       case 3:
+          puts_filtered ("Data (Read/Write, Exp-down");
+          break;
+       case 4:
+          puts_filtered ("Code (Exec-Only, N.Conf");
+          break;
+       case 5:
+          puts_filtered ("Code (Exec/Read, N.Conf");
+         break;
+       case 6:
+          puts_filtered ("Code (Exec-Only, Conf");
+         break;
+       case 7:
+          puts_filtered ("Code (Exec/Read, Conf");
+         break;
+       default:
+         printf_filtered ("Unknown type 0x%x",info.HighWord.Bits.Type);
+       }
+      if ((info.HighWord.Bits.Type & 0x1) == 0)
+        puts_filtered(", N.Acc");
+      puts_filtered (")\n");
+      if ((info.HighWord.Bits.Type & 0x10) == 0)
+       puts_filtered("System selector ");
+      printf_filtered ("Priviledge level = %d. ", info.HighWord.Bits.Dpl);
+      if (info.HighWord.Bits.Granularity)
+        puts_filtered ("Page granular.\n");
+      else
+       puts_filtered ("Byte granular.\n");
+      return 1;
+    }
+  else
+    {
+      printf_filtered ("Invalid selector 0x%lx.\n",sel);
+      return 0;
+    }
+}
+
+static void
+display_selectors (char * args, int from_tty)
+{
+  if (!current_thread)
+    {
+      puts_filtered ("Impossible to display selectors now.\n");
+      return;
+    }
+  if (!args)
+    {
+
+      puts_filtered ("Selector $cs\n");
+      display_selector (current_thread->h,
+        current_thread->context.SegCs);
+      puts_filtered ("Selector $ds\n");
+      display_selector (current_thread->h,
+        current_thread->context.SegDs);
+      puts_filtered ("Selector $es\n");
+      display_selector (current_thread->h,
+        current_thread->context.SegEs);
+      puts_filtered ("Selector $ss\n");
+      display_selector (current_thread->h,
+        current_thread->context.SegSs);
+      puts_filtered ("Selector $fs\n");
+      display_selector (current_thread->h,
+       current_thread->context.SegFs);
+      puts_filtered ("Selector $gs\n");
+      display_selector (current_thread->h,
+        current_thread->context.SegGs);
+    }
+  else
+    {
+      int sel;
+      sel = parse_and_eval_long (args);
+      printf_filtered ("Selector \"%s\"\n",args);
+      display_selector (current_thread->h, sel);
+    }
+}
+
+static struct cmd_list_element *info_w32_cmdlist = NULL;
+
+static void
+info_w32_command (char *args, int from_tty)
+{
+  help_list (info_w32_cmdlist, "info w32 ", class_info, gdb_stdout);
+}
+
+
 #define DEBUG_EXCEPTION_SIMPLE(x)       if (debug_exceptions) \
   printf_unfiltered ("gdb: Target exception %s at 0x%08lx\n", x, \
   (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress)
@@ -1758,6 +1878,14 @@ _initialize_inftarg (void)
   add_info ("dll", info_dll_command, "Status of loaded DLLs.");
   add_info_alias ("sharedlibrary", "dll", 1);
 
+  add_prefix_cmd ("w32", class_info, info_w32_command,
+                  "Print information specific to Win32 debugging.",
+                  &info_w32_cmdlist, "info w32 ", 0, &infolist);
+
+  add_cmd ("selector", class_info, display_selectors,
+           "Display selectors infos.",
+          &info_w32_cmdlist);
+
   add_target (&child_ops);
 }
 
index 2f7e8cc..610af6f 100644 (file)
@@ -820,6 +820,126 @@ handle_output_debug_string (struct target_waitstatus *ourstatus)
   return gotasig;
 }
 
+static int
+display_selector (HANDLE thread, DWORD sel)
+{
+  LDT_ENTRY info;
+  if (GetThreadSelectorEntry (thread, sel, &info))
+    {
+      int base, limit;
+      printf_filtered ("0x%03lx: ", sel);
+      if (!info.HighWord.Bits.Pres)
+        {
+          puts_filtered ("Segment not present\n");
+          return 0;
+        }
+      base = (info.HighWord.Bits.BaseHi << 24) +
+            (info.HighWord.Bits.BaseMid << 16)
+            + info.BaseLow;
+      limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
+      if (info.HighWord.Bits.Granularity)
+       limit = (limit << 12) | 0xfff;
+      printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
+      if (info.HighWord.Bits.Default_Big)
+        puts_filtered(" 32-bit ");
+      else
+        puts_filtered(" 16-bit ");
+      switch ((info.HighWord.Bits.Type & 0xf) >> 1)
+       {
+       case 0:
+          puts_filtered ("Data (Read-Only, Exp-up");
+          break;
+       case 1:
+          puts_filtered ("Data (Read/Write, Exp-up");
+          break;
+       case 2:
+          puts_filtered ("Unused segment (");
+          break;
+       case 3:
+          puts_filtered ("Data (Read/Write, Exp-down");
+          break;
+       case 4:
+          puts_filtered ("Code (Exec-Only, N.Conf");
+          break;
+       case 5:
+          puts_filtered ("Code (Exec/Read, N.Conf");
+         break;
+       case 6:
+          puts_filtered ("Code (Exec-Only, Conf");
+         break;
+       case 7:
+          puts_filtered ("Code (Exec/Read, Conf");
+         break;
+       default:
+         printf_filtered ("Unknown type 0x%x",info.HighWord.Bits.Type);
+       }
+      if ((info.HighWord.Bits.Type & 0x1) == 0)
+        puts_filtered(", N.Acc");
+      puts_filtered (")\n");
+      if ((info.HighWord.Bits.Type & 0x10) == 0)
+       puts_filtered("System selector ");
+      printf_filtered ("Priviledge level = %d. ", info.HighWord.Bits.Dpl);
+      if (info.HighWord.Bits.Granularity)
+        puts_filtered ("Page granular.\n");
+      else
+       puts_filtered ("Byte granular.\n");
+      return 1;
+    }
+  else
+    {
+      printf_filtered ("Invalid selector 0x%lx.\n",sel);
+      return 0;
+    }
+}
+
+static void
+display_selectors (char * args, int from_tty)
+{
+  if (!current_thread)
+    {
+      puts_filtered ("Impossible to display selectors now.\n");
+      return;
+    }
+  if (!args)
+    {
+
+      puts_filtered ("Selector $cs\n");
+      display_selector (current_thread->h,
+        current_thread->context.SegCs);
+      puts_filtered ("Selector $ds\n");
+      display_selector (current_thread->h,
+        current_thread->context.SegDs);
+      puts_filtered ("Selector $es\n");
+      display_selector (current_thread->h,
+        current_thread->context.SegEs);
+      puts_filtered ("Selector $ss\n");
+      display_selector (current_thread->h,
+        current_thread->context.SegSs);
+      puts_filtered ("Selector $fs\n");
+      display_selector (current_thread->h,
+       current_thread->context.SegFs);
+      puts_filtered ("Selector $gs\n");
+      display_selector (current_thread->h,
+        current_thread->context.SegGs);
+    }
+  else
+    {
+      int sel;
+      sel = parse_and_eval_long (args);
+      printf_filtered ("Selector \"%s\"\n",args);
+      display_selector (current_thread->h, sel);
+    }
+}
+
+static struct cmd_list_element *info_w32_cmdlist = NULL;
+
+static void
+info_w32_command (char *args, int from_tty)
+{
+  help_list (info_w32_cmdlist, "info w32 ", class_info, gdb_stdout);
+}
+
+
 #define DEBUG_EXCEPTION_SIMPLE(x)       if (debug_exceptions) \
   printf_unfiltered ("gdb: Target exception %s at 0x%08lx\n", x, \
   (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress)
@@ -1758,6 +1878,14 @@ _initialize_inftarg (void)
   add_info ("dll", info_dll_command, "Status of loaded DLLs.");
   add_info_alias ("sharedlibrary", "dll", 1);
 
+  add_prefix_cmd ("w32", class_info, info_w32_command,
+                  "Print information specific to Win32 debugging.",
+                  &info_w32_cmdlist, "info w32 ", 0, &infolist);
+
+  add_cmd ("selector", class_info, display_selectors,
+           "Display selectors infos.",
+          &info_w32_cmdlist);
+
   add_target (&child_ops);
 }