X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flinux-i386-ipa.c;h=39afcaf2cfd6d852b7e4f356968702803c957d1a;hb=cf4088a92f240b01e6db8f39a5a3abfa918f6f2c;hp=4860012f15c980ea3830b4416ae3fad9c5b3ddc6;hpb=ae91f6253926e4dadebcae90772f4f5a5bd06056;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-i386-ipa.c b/gdb/gdbserver/linux-i386-ipa.c index 4860012f15..39afcaf2cf 100644 --- a/gdb/gdbserver/linux-i386-ipa.c +++ b/gdb/gdbserver/linux-i386-ipa.c @@ -1,7 +1,7 @@ /* GNU/Linux/x86 specific low level interface, for the in-process agent library for GDB. - Copyright (C) 2010-2016 Free Software Foundation, Inc. + Copyright (C) 2010-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -22,6 +22,7 @@ #include #include "tracepoint.h" #include "linux-x86-tdesc.h" +#include "common/x86-xstate.h" /* GDB register numbers. */ @@ -95,8 +96,8 @@ supply_fast_tracepoint_registers (struct regcache *regcache, } } -IP_AGENT_EXPORT_FUNC ULONGEST -gdb_agent_get_raw_reg (const unsigned char *raw_regs, int regnum) +ULONGEST +get_raw_reg (const unsigned char *raw_regs, int regnum) { /* This should maybe be allowed to return an error code, or perhaps better, have the emit_reg detect this, and emit a constant zero, @@ -244,38 +245,50 @@ initialize_fast_tracepoint_trampoline_buffer (void) } } +/* Map the tdesc index to xcr0 mask. */ +static uint64_t idx2mask[X86_TDESC_LAST] = { + X86_XSTATE_X87_MASK, + X86_XSTATE_SSE_MASK, + X86_XSTATE_AVX_MASK, + X86_XSTATE_MPX_MASK, + X86_XSTATE_AVX_MPX_MASK, + X86_XSTATE_AVX_AVX512_MASK, + X86_XSTATE_AVX_MPX_AVX512_PKU_MASK, +}; + /* Return target_desc to use for IPA, given the tdesc index passed by gdbserver. */ const struct target_desc * get_ipa_tdesc (int idx) { - switch (idx) + if (idx >= X86_TDESC_LAST) { - case X86_TDESC_MMX: - return tdesc_i386_mmx_linux; - case X86_TDESC_SSE: - return tdesc_i386_linux; - case X86_TDESC_AVX: - return tdesc_i386_avx_linux; - case X86_TDESC_MPX: - return tdesc_i386_mpx_linux; - case X86_TDESC_AVX512: - return tdesc_i386_avx512_linux; - default: internal_error (__FILE__, __LINE__, "unknown ipa tdesc index: %d", idx); - return tdesc_i386_linux; } + return i386_linux_read_description (idx2mask[idx]); +} + +/* Allocate buffer for the jump pads. On i386, we can reach an arbitrary + address with a jump instruction, so just allocate normally. */ + +void * +alloc_jump_pad_buffer (size_t size) +{ + void *res = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + if (res == MAP_FAILED) + return NULL; + + return res; } void initialize_low_tracepoint (void) { - init_registers_i386_mmx_linux (); - init_registers_i386_linux (); - init_registers_i386_avx_linux (); - init_registers_i386_mpx_linux (); - init_registers_i386_avx512_linux (); initialize_fast_tracepoint_trampoline_buffer (); + for (auto i = 0; i < X86_TDESC_LAST; i++) + i386_linux_read_description (idx2mask[i]); }