From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23228 invoked by alias); 5 Sep 2013 09:26:44 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 23208 invoked by uid 89); 5 Sep 2013 09:26:44 -0000 Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 05 Sep 2013 09:26:44 +0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.8 required=5.0 tests=AWL,BAYES_00,KHOP_THREADED,RDNS_NONE autolearn=no version=3.3.2 X-HELO: mga11.intel.com Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 05 Sep 2013 02:26:41 -0700 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga002.fm.intel.com with ESMTP; 05 Sep 2013 02:26:40 -0700 Received: from ulslx001.iul.intel.com (ulslx001.iul.intel.com [172.28.207.63]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id r859Qd1p001751; Thu, 5 Sep 2013 10:26:39 +0100 Received: from ulslx001.iul.intel.com (localhost [127.0.0.1]) by ulslx001.iul.intel.com with ESMTP id r859Qd6h031221; Thu, 5 Sep 2013 11:26:39 +0200 Received: (from wtedesch@localhost) by ulslx001.iul.intel.com with id r859QdD0031217; Thu, 5 Sep 2013 11:26:39 +0200 From: Walfred Tedeschi To: tromey@redhat.com, gdb-patches@sourceware.org, mark.kettenis@xs4all.nl Cc: Walfred Tedeschi Subject: [PATCH V4 4/8] MPX for amd64 Date: Thu, 05 Sep 2013 09:26:00 -0000 Message-Id: <1378373188-31144-5-git-send-email-walfred.tedeschi@intel.com> In-Reply-To: <1378373188-31144-1-git-send-email-walfred.tedeschi@intel.com> References: <1378373188-31144-1-git-send-email-walfred.tedeschi@intel.com> X-IsSubscribed: yes X-SW-Source: 2013-09/txt/msg00151.txt.bz2 2013-06-24 Walfred Tedeschi * amd64-linux-nat.c (amd64_linux_gregset32_reg_offset): Add MPX registers. (amd64_linux_read_description): Add initialization for MPX and AVX independently. * amd64-linux-tdep.c: Includes features/i386/amd64-mpx-linux.c and features/i386/x32-mpx-linux.c. (amd64_linux_gregset_reg_offset): Add MPX registers. (amd64_linux_core_read_description): Add initialization for MPX registers. (_initialize_amd64_linux_tdep): Initialize MPX targets. * amd64-linux-tdep.h (AMD64_LINUX_NUM_REGS): Set it to the last register on the list. (tdesc_amd64_mpx_linux and tdesc_x32_mpx_linux) Add new targets for MPX. * amd64-tdep.c: Includes features/i386/amd64-mpx.c and features/i386/x32-mpx.c. (amd64_mpx_names): MPX register names. (amd64_init_abi): Add MPX register while initializing the ABI. (_initialize_amd64_tdep): Initialize MPX targets. * amd64-tdep.h (amd64_regnum): Add MPX registers. (AMD64_NUM_REGS): Set number of registers taking MPX into account. --- gdb/amd64-linux-nat.c | 43 ++++++++++++++++++++++++++++++++++--------- gdb/amd64-linux-tdep.c | 14 +++++++++++++- gdb/amd64-linux-tdep.h | 6 ++++-- gdb/amd64-tdep.c | 18 ++++++++++++++++++ gdb/amd64-tdep.h | 8 ++++++-- 5 files changed, 75 insertions(+), 14 deletions(-) diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c index 8dfe7c5..a230dca 100644 --- a/gdb/amd64-linux-nat.c +++ b/gdb/amd64-linux-nat.c @@ -100,7 +100,9 @@ static int amd64_linux_gregset32_reg_offset[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - ORIG_RAX * 8 /* "orig_eax" */ + ORIG_RAX * 8, /* "orig_eax" */ + -1, -1, -1, -1, /* MPX registers BND0 ... BND3. */ + -1, -1 /* MPX registers BNDCFGU, BNDSTATUS. */ }; @@ -1094,18 +1096,41 @@ amd64_linux_read_description (struct target_ops *ops) } /* Check the native XCR0 only if PTRACE_GETREGSET is available. */ - if (have_ptrace_getregset - && (xcr0 & I386_XSTATE_AVX_MASK) == I386_XSTATE_AVX_MASK) + if (have_ptrace_getregset && (xcr0 & I386_XSTATE_ALL_MASK)) { - if (is_64bit) + switch (xcr0 & I386_XSTATE_ALL_MASK) { - if (is_x32) - return tdesc_x32_avx_linux; + case I386_XSTATE_MPX_MASK: + if (is_64bit) + { + if (is_x32) + return tdesc_x32_mpx_linux; + else + return tdesc_amd64_mpx_linux; + } + else + return tdesc_i386_mpx_linux; + case I386_XSTATE_AVX_MASK: + if (is_64bit) + { + if (is_x32) + return tdesc_x32_avx_linux; + else + return tdesc_amd64_avx_linux; + } + else + return tdesc_i386_avx_linux; + default: + if (is_64bit) + { + if (is_x32) + return tdesc_x32_linux; + else + return tdesc_amd64_linux; + } else - return tdesc_amd64_avx_linux; + return tdesc_i386_linux; } - else - return tdesc_i386_avx_linux; } else { diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c index 4f67762..9740aff 100644 --- a/gdb/amd64-linux-tdep.c +++ b/gdb/amd64-linux-tdep.c @@ -42,8 +42,10 @@ #include "features/i386/amd64-linux.c" #include "features/i386/amd64-avx-linux.c" +#include "features/i386/amd64-mpx-linux.c" #include "features/i386/x32-linux.c" #include "features/i386/x32-avx-linux.c" +#include "features/i386/x32-mpx-linux.c" /* The syscall's XML filename for i386. */ #define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml" @@ -96,6 +98,8 @@ int amd64_linux_gregset_reg_offset[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, /* MPX registers BND0 ... BND3. */ + -1, -1, /* MPX registers BNDCFGU and BNDSTATUS. */ 15 * 8 /* "orig_rax" */ }; @@ -1287,8 +1291,14 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch, { /* Linux/x86-64. */ uint64_t xcr0 = i386_linux_core_read_xcr0 (abfd); - switch ((xcr0 & I386_XSTATE_AVX_MASK)) + + switch (xcr0 & I386_XSTATE_ALL_MASK) { + case I386_XSTATE_MPX_MASK: + if (gdbarch_ptr_bit (gdbarch) == 32) + return tdesc_x32_mpx_linux; + else + return tdesc_amd64_mpx_linux; case I386_XSTATE_AVX_MASK: if (gdbarch_ptr_bit (gdbarch) == 32) return tdesc_x32_avx_linux; @@ -1623,6 +1633,8 @@ _initialize_amd64_linux_tdep (void) /* Initialize the Linux target description. */ initialize_tdesc_amd64_linux (); initialize_tdesc_amd64_avx_linux (); + initialize_tdesc_amd64_mpx_linux (); initialize_tdesc_x32_linux (); initialize_tdesc_x32_avx_linux (); + initialize_tdesc_x32_mpx_linux (); } diff --git a/gdb/amd64-linux-tdep.h b/gdb/amd64-linux-tdep.h index e9eaeaa..ec10b7c 100644 --- a/gdb/amd64-linux-tdep.h +++ b/gdb/amd64-linux-tdep.h @@ -26,16 +26,18 @@ /* Register number for the "orig_rax" register. If this register contains a value >= 0 it is interpreted as the system call number that the kernel is supposed to restart. */ -#define AMD64_LINUX_ORIG_RAX_REGNUM (AMD64_YMM15H_REGNUM + 1) +#define AMD64_LINUX_ORIG_RAX_REGNUM (AMD64_BNDSTATUS_REGNUM + 1) /* Total number of registers for GNU/Linux. */ -#define AMD64_LINUX_NUM_REGS (AMD64_LINUX_ORIG_RAX_REGNUM + 1) +#define AMD64_LINUX_NUM_REGS (AMD64_BNDSTATUS_REGNUM + 2) /* Linux target description. */ extern struct target_desc *tdesc_amd64_linux; extern struct target_desc *tdesc_amd64_avx_linux; +extern struct target_desc *tdesc_amd64_mpx_linux; extern struct target_desc *tdesc_x32_linux; extern struct target_desc *tdesc_x32_avx_linux; +extern struct target_desc *tdesc_x32_mpx_linux; /* Enum that defines the syscall identifiers for amd64 linux. Used for process record/replay, these will be translated into diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 3ab74f0..f0654ba 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -43,8 +43,10 @@ #include "features/i386/amd64.c" #include "features/i386/amd64-avx.c" +#include "features/i386/amd64-mpx.c" #include "features/i386/x32.c" #include "features/i386/x32-avx.c" +#include "features/i386/x32-mpx.c" #include "ax.h" #include "ax-gdb.h" @@ -92,6 +94,11 @@ static const char *amd64_ymmh_names[] = "ymm12h", "ymm13h", "ymm14h", "ymm15h" }; +static const char *amd64_mpx_names[] = +{ + "bnd0raw", "bnd1raw", "bnd2raw", "bnd3raw", "bndcfgu", "bndstatus" +}; + /* The registers used to pass integer arguments during a function call. */ static int amd64_dummy_call_integer_regs[] = { @@ -2870,6 +2877,15 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->ymm0h_regnum = AMD64_YMM0H_REGNUM; } + if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.mpx") != NULL) + { + tdep->mpx_register_names = amd64_mpx_names; + tdep->num_mpx_regs = AMD64_BNDSTATUS_REGNUM - AMD64_BND0R_REGNUM + 1; + tdep->bndcfgu_regnum = AMD64_BNDCFGU_REGNUM; + tdep->bnd0r_regnum = AMD64_BND0R_REGNUM; + tdep->num_bnd_regs = 4; + } + tdep->num_byte_regs = 20; tdep->num_word_regs = 16; tdep->num_dword_regs = 16; @@ -3015,8 +3031,10 @@ _initialize_amd64_tdep (void) { initialize_tdesc_amd64 (); initialize_tdesc_amd64_avx (); + initialize_tdesc_amd64_mpx (); initialize_tdesc_x32 (); initialize_tdesc_x32_avx (); + initialize_tdesc_x32_mpx (); } diff --git a/gdb/amd64-tdep.h b/gdb/amd64-tdep.h index a33e7d6..320f147 100644 --- a/gdb/amd64-tdep.h +++ b/gdb/amd64-tdep.h @@ -64,13 +64,17 @@ enum amd64_regnum AMD64_XMM1_REGNUM, /* %xmm1 */ AMD64_MXCSR_REGNUM = AMD64_XMM0_REGNUM + 16, AMD64_YMM0H_REGNUM, /* %ymm0h */ - AMD64_YMM15H_REGNUM = AMD64_YMM0H_REGNUM + 15 + AMD64_YMM15H_REGNUM = AMD64_YMM0H_REGNUM + 15, + AMD64_BND0R_REGNUM = AMD64_YMM15H_REGNUM + 1, + AMD64_BND3R_REGNUM = AMD64_BND0R_REGNUM + 3, + AMD64_BNDCFGU_REGNUM, + AMD64_BNDSTATUS_REGNUM }; /* Number of general purpose registers. */ #define AMD64_NUM_GREGS 24 -#define AMD64_NUM_REGS (AMD64_YMM15H_REGNUM + 1) +#define AMD64_NUM_REGS (AMD64_BNDSTATUS_REGNUM + 1) extern struct displaced_step_closure *amd64_displaced_step_copy_insn (struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, -- 1.7.10.4