[COMMITTED] Darwin: sanitise segment registers value

Message ID F9EAE877-14D5-438B-9A33-35963C50C436@adacore.com
State Committed
Headers

Commit Message

Tristan Gingold Oct. 16, 2014, noon UTC
  Hi,

Some Darwin kernels return values out of bounds for gs and fs segments.
With this commit, they are masked to avoid garbage.

gdb/ChangeLog:
	* i386-darwin-nat.c (i386_darwin_fetch_inferior_registers)
	(i386_darwin_store_inferior_registers): Sanitize gs and fs values
	on amd64.
  

Patch

diff --git a/gdb/i386-darwin-nat.c b/gdb/i386-darwin-nat.c
index a60bc6c..f99e415 100644
--- a/gdb/i386-darwin-nat.c
+++ b/gdb/i386-darwin-nat.c
@@ -73,6 +73,11 @@  i386_darwin_fetch_inferior_registers (struct target_ops *ops,
 				 (unsigned long) current_thread);
 	      MACH_CHECK_ERROR (ret);
 	    }
+
+	  /* Some kernels don't sanitize the values.  */
+	  gp_regs.uts.ts64.__fs &= 0xffff;
+	  gp_regs.uts.ts64.__gs &= 0xffff;
+
 	  amd64_supply_native_gregset (regcache, &gp_regs.uts, -1);
           fetched++;
         }
@@ -183,6 +188,10 @@  i386_darwin_store_inferior_registers (struct target_ops *ops,
 
 	  amd64_collect_native_gregset (regcache, &gp_regs.uts, regno);
 
+	  /* Some kernels don't sanitize the values.  */
+	  gp_regs.uts.ts64.__fs &= 0xffff;
+	  gp_regs.uts.ts64.__gs &= 0xffff;
+
           ret = thread_set_state (current_thread, x86_THREAD_STATE,
                                   (thread_state_t) &gp_regs,
                                   x86_THREAD_STATE_COUNT);