This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[COMMITTED PATCH] Darwin: sanitise segment registers value
- From: Tristan Gingold <gingold at adacore dot com>
- To: "<gdb-patches at sourceware dot org> ml" <gdb-patches at sourceware dot org>
- Date: Thu, 16 Oct 2014 14:00:04 +0200
- Subject: [COMMITTED PATCH] Darwin: sanitise segment registers value
- Authentication-results: sourceware.org; auth=none
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.
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);