X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flinux-i386-ipa.c;h=39afcaf2cfd6d852b7e4f356968702803c957d1a;hb=cf4088a92f240b01e6db8f39a5a3abfa918f6f2c;hp=11dc0380250f3437257e52e71fef267bb8ce25f3;hpb=618f726fcb851883a0094aa7fa17003889b7189f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-i386-ipa.c b/gdb/gdbserver/linux-i386-ipa.c index 11dc038025..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. @@ -21,6 +21,8 @@ #include "server.h" #include #include "tracepoint.h" +#include "linux-x86-tdesc.h" +#include "common/x86-xstate.h" /* GDB register numbers. */ @@ -47,10 +49,6 @@ enum i386_gdb_regnum #define i386_num_regs 16 -/* Defined in auto-generated file i386-linux.c. */ -void init_registers_i386_linux (void); -extern const struct target_desc *tdesc_i386_linux; - #define FT_CR_EAX 15 #define FT_CR_ECX 14 #define FT_CR_EDX 13 @@ -98,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, @@ -247,10 +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) +{ + if (idx >= X86_TDESC_LAST) + { + internal_error (__FILE__, __LINE__, + "unknown ipa tdesc index: %d", idx); + } + 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_linux (); - ipa_tdesc = tdesc_i386_linux; initialize_fast_tracepoint_trampoline_buffer (); + for (auto i = 0; i < X86_TDESC_LAST; i++) + i386_linux_read_description (idx2mask[i]); }