mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 06:45:56 +08:00
btrace: support 32-bit inferior on 64-bit host
The heuristic for filtering out kernel addressess in BTS trace checks the most significant bit in each address. This works fine for 32-bit and 64-bit mode. For 32-bit compatibility mode, i.e. a 32-bit inferior running on 64-bit host, we need to check bit 63 (or any bit bigger than 31), not bit 31. Use the machine field in struct utsname provided by a uname call to determine whether we are running on a 64-bit host. Thanks to Jan Kratochvil for reporting the issue. gdb/ * nat/linux-btrace.c: Include sys/utsname.h. (linux_determine_kernel_ptr_bits): New. (linux_enable_bts): Call linux_determine_kernel_ptr_bits. * x86-linux-nat.c (x86_linux_enable_btrace): Do not overwrite non-zero ptr_bits. gdbserver/ * linux-low.c (linux_low_enable_btrace): Do not overwrite non-zero ptr_bits.
This commit is contained in:
@ -450,9 +450,11 @@ x86_linux_enable_btrace (struct target_ops *self, ptid_t ptid,
|
||||
target_pid_to_str (ptid), safe_strerror (errno));
|
||||
|
||||
/* Fill in the size of a pointer in bits. */
|
||||
gdbarch = target_thread_architecture (ptid);
|
||||
tinfo->ptr_bits = gdbarch_ptr_bit (gdbarch);
|
||||
|
||||
if (tinfo->ptr_bits == 0)
|
||||
{
|
||||
gdbarch = target_thread_architecture (ptid);
|
||||
tinfo->ptr_bits = gdbarch_ptr_bit (gdbarch);
|
||||
}
|
||||
return tinfo;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user