From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 68078 invoked by alias); 18 Mar 2016 14:16:37 -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 68059 invoked by uid 89); 18 Mar 2016 14:16:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.4 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=no version=3.3.2 spammy=177219, H*r:sk:wtedesc X-HELO: mga11.intel.com 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; Fri, 18 Mar 2016 14:16:26 +0000 Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga102.fm.intel.com with ESMTP; 18 Mar 2016 07:16:10 -0700 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga001.jf.intel.com with ESMTP; 18 Mar 2016 07:16:08 -0700 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id u2IEG8PA030683; Fri, 18 Mar 2016 14:16:08 GMT Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id u2IEG7sB020015; Fri, 18 Mar 2016 15:16:07 +0100 Received: (from wtedesch@localhost) by ulvlx001.iul.intel.com with œ id u2IEG7ni020011; Fri, 18 Mar 2016 15:16:07 +0100 From: Walfred Tedeschi To: palves@redhat.com, brobecker@adacore.com Cc: gdb-patches@sourceware.org, Walfred Tedeschi Subject: [PATCH V5 1/2] Initialize bnd register before performing inferior calls. Date: Fri, 18 Mar 2016 14:16:00 -0000 Message-Id: <1458310565-19980-1-git-send-email-walfred.tedeschi@intel.com> X-IsSubscribed: yes X-SW-Source: 2016-03/txt/msg00329.txt.bz2 BND registers should be initialized before performing an inferior call to avoid undesired bound violations. 2016-02-03 Walfred Tedeschi gdb/ChangeLog: * i387-tdep.h (i387_reset_bnd_regs): New. * i387-tdep.c (i387_reset_bnd_regs): New. * i386-tdep.c (i386_push_dummy_call): Call i387_reset_bnd_regs. * amd64-tdep (amd64_push_dummy_call): Call i387_reset_bnd_regs. --- gdb/amd64-tdep.c | 5 +++++ gdb/i386-tdep.c | 5 +++++ gdb/i387-tdep.c | 16 ++++++++++++++++ gdb/i387-tdep.h | 6 ++++++ 4 files changed, 32 insertions(+) diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index a62efde..c1aca26 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -997,6 +997,11 @@ amd64_push_dummy_call (struct gdbarch *gdbarch, struct value *function, enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); gdb_byte buf[8]; + /* When MPX is enabled, all bnd registers have to be initialized + before the call. This avoids an undesired bound violation + during the function's execution. */ + i387_reset_bnd_regs (gdbarch, regcache); + /* Pass arguments. */ sp = amd64_push_arguments (regcache, nargs, args, sp, struct_return); diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 4c66edf..e8d41a3 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -2665,6 +2665,11 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function, int write_pass; int args_space = 0; + /* When MPX is enabled, all bnd registers have to be initialized + before the call. This avoids an undesired bound violation + during the function's execution. */ + i387_reset_bnd_regs (gdbarch, regcache); + /* Determine the total space required for arguments and struct return address in a first pass (allowing for 16-byte-aligned arguments), then push arguments in a second pass. */ diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c index f7a3b55..9bb3177 100644 --- a/gdb/i387-tdep.c +++ b/gdb/i387-tdep.c @@ -1772,3 +1772,19 @@ i387_return_value (struct gdbarch *gdbarch, struct regcache *regcache) regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff); } + +void +i387_reset_bnd_regs (struct gdbarch *gdbarch, struct regcache *regcache) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (I387_BND0R_REGNUM (tdep) > 0) + { + gdb_byte bnd_buf[16]; + int i; + + memset (bnd_buf, 0, 16); + for (i = 0; i < I387_BND0R_REGNUM (tdep); i++) + regcache_raw_write (regcache, I387_BND0R_REGNUM (tdep) + i, bnd_buf); + } +} diff --git a/gdb/i387-tdep.h b/gdb/i387-tdep.h index b4dc2b7..3ac4b4d 100644 --- a/gdb/i387-tdep.h +++ b/gdb/i387-tdep.h @@ -156,4 +156,10 @@ extern void i387_collect_xsave (const struct regcache *regcache, extern void i387_return_value (struct gdbarch *gdbarch, struct regcache *regcache); +/* Set all bnd registers to the INIT state. INIT state means + all memory range can be accessed. */ + +extern void i387_reset_bnd_regs (struct gdbarch *gdbarch, + struct regcache *regcache); + #endif /* i387-tdep.h */ -- 2.1.4