2000-03-11 Mark Kettenis <kettenis@gnu.org>
authorMark Kettenis <kettenis@gnu.org>
Sat, 11 Mar 2000 00:34:50 +0000 (00:34 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 11 Mar 2000 00:34:50 +0000 (00:34 +0000)
* i386gnu-nat.c (gnu_store_registers): Make sure the T bit in the
%eflags isn't modified.  This fixes a bug where every call to a
function in the program beyond the first call would fail.

gdb/ChangeLog
gdb/i386gnu-nat.c

index 24bc1245cc9713e61f5f75bb5a67283330ee72e7..2fd2e43adcf0052ad3a886b73becb1afeab1d084 100644 (file)
@@ -1,3 +1,9 @@
+2000-03-11  Mark Kettenis  <kettenis@gnu.org>
+
+       * i386gnu-nat.c (gnu_store_registers): Make sure the T bit in the
+       %eflags isn't modified.  This fixes a bug where every call to a
+       function in the program beyond the first call would fail.
+
 2000-03-10  Daniel Berlin  <dan@cgsoftware.com>
        Fix C++ overloading, add support for seeing through references.
 
index bc13229d9909eca32105a2d5c1c86ed33b045813..7554d1aed2cccc0d3bde558ff603f8d079181782 100644 (file)
@@ -1,5 +1,5 @@
 /* Low level interface to i386 running the GNU Hurd.
-   Copyright (C) 1992, 1995, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1995, 1996, 2000 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -265,6 +265,7 @@ gnu_store_registers (int regno)
       thread_state_data_t old_state;
       int was_aborted = thread->aborted;
       int was_valid = thread->state_valid;
+      int trace;
 
       if (!was_aborted && was_valid)
        memcpy (&old_state, &thread->state, sizeof (old_state));
@@ -276,6 +277,10 @@ gnu_store_registers (int regno)
          return;
        }
 
+      /* Save the T bit.  We might try to restore the %eflags register
+         below, but changing the T bit would seriously confuse GDB.  */
+      trace = ((struct i386_thread_state *)state)->efl & 0x100;
+
       if (!was_aborted && was_valid)
        /* See which registers have changed after aborting the thread.  */
        {
@@ -319,6 +324,10 @@ gnu_store_registers (int regno)
          assert (register_valid[regno]);
          fill (state, regno);
        }
+
+      /* Restore the T bit.  */
+      ((struct i386_thread_state *)state)->efl &= ~0x100;
+      ((struct i386_thread_state *)state)->efl |= trace;
     }
 
 #undef fill