Commit-ID:  b8d2eff3b1c6e46238a5fb3f56843e9974b4889f
Gitweb:     https://git.kernel.org/tip/b8d2eff3b1c6e46238a5fb3f56843e9974b4889f
Author:     Ricardo Neri <[email protected]>
AuthorDate: Fri, 27 Oct 2017 13:25:33 -0700
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Wed, 1 Nov 2017 21:50:09 +0100

x86/mpx: Use signed variables to compute effective addresses

Even though memory addresses are unsigned, the operands used to compute the
effective address do have a sign. This is true for ModRM.rm, SIB.base,
SIB.index as well as the displacement bytes. Thus, signed variables shall
be used when computing the effective address from these operands. Once the
signed effective address has been computed, it is casted to an unsigned
long to determine the linear address.

Variables are renamed to better reflect the type of address being
computed.

Signed-off-by: Ricardo Neri <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
Reviewed-by: Borislav Petkov <[email protected]>
Cc: Adan Hawthorn <[email protected]>
Cc: "Michael S. Tsirkin" <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: [email protected]
Cc: Paul Gortmaker <[email protected]>
Cc: Huang Rui <[email protected]>
Cc: Qiaowei Ren <[email protected]>
Cc: Shuah Khan <[email protected]>
Cc: Jonathan Corbet <[email protected]>
Cc: Jiri Slaby <[email protected]>
Cc: Nathan Howard <[email protected]>
Cc: "Ravi V. Shankar" <[email protected]>
Cc: Chris Metcalf <[email protected]>
Cc: Brian Gerst <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Colin Ian King <[email protected]>
Cc: Chen Yucong <[email protected]>
Cc: Adam Buchbinder <[email protected]>
Cc: Vlastimil Babka <[email protected]>
Cc: Lorenzo Stoakes <[email protected]>
Cc: Masami Hiramatsu <[email protected]>
Cc: Joe Perches <[email protected]>
Cc: Paolo Bonzini <[email protected]>
Cc: Andrew Morton <[email protected]>
Link: 
https://lkml.kernel.org/r/1509135945-13762-7-git-send-email-ricardo.neri-calde...@linux.intel.com

---
 arch/x86/mm/mpx.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/arch/x86/mm/mpx.c b/arch/x86/mm/mpx.c
index f4c48a0..57e5bf5 100644
--- a/arch/x86/mm/mpx.c
+++ b/arch/x86/mm/mpx.c
@@ -138,8 +138,9 @@ static int get_reg_offset(struct insn *insn, struct pt_regs 
*regs,
  */
 static void __user *mpx_get_addr_ref(struct insn *insn, struct pt_regs *regs)
 {
-       unsigned long addr = -1L, base, indx;
        int addr_offset, base_offset, indx_offset;
+       unsigned long linear_addr = -1L;
+       long eff_addr, base, indx;
        insn_byte_t sib;
 
        insn_get_modrm(insn);
@@ -150,7 +151,8 @@ static void __user *mpx_get_addr_ref(struct insn *insn, 
struct pt_regs *regs)
                addr_offset = get_reg_offset(insn, regs, REG_TYPE_RM);
                if (addr_offset < 0)
                        goto out;
-               addr = regs_get_register(regs, addr_offset);
+
+               eff_addr = regs_get_register(regs, addr_offset);
        } else {
                if (insn->sib.nbytes) {
                        base_offset = get_reg_offset(insn, regs, REG_TYPE_BASE);
@@ -163,17 +165,23 @@ static void __user *mpx_get_addr_ref(struct insn *insn, 
struct pt_regs *regs)
 
                        base = regs_get_register(regs, base_offset);
                        indx = regs_get_register(regs, indx_offset);
-                       addr = base + indx * (1 << X86_SIB_SCALE(sib));
+
+                       eff_addr = base + indx * (1 << X86_SIB_SCALE(sib));
                } else {
                        addr_offset = get_reg_offset(insn, regs, REG_TYPE_RM);
                        if (addr_offset < 0)
                                goto out;
-                       addr = regs_get_register(regs, addr_offset);
+
+                       eff_addr = regs_get_register(regs, addr_offset);
                }
-               addr += insn->displacement.value;
+
+               eff_addr += insn->displacement.value;
        }
+
+       linear_addr = (unsigned long)eff_addr;
+
 out:
-       return (void __user *)addr;
+       return (void __user *)linear_addr;
 }
 
 static int mpx_insn_decode(struct insn *insn,

Reply via email to