Commit b15d70df authored by Ricardo Neri's avatar Ricardo Neri Committed by Thomas Gleixner

x86/mpx: Simplify handling of errors when computing linear addresses

When errors occur in the computation of the linear address, -1L is
returned. Rather than having a separate return path for errors, the
variable used to return the computed linear address can be initialized
with the error value. Hence, only one return path is needed. This makes
the function easier to read.

While here, ensure that the error value is -1L, a 64-bit value, rather
than -1, a 32-bit value.
Suggested-by: default avatarBorislav Petkov <bp@suse.de>
Signed-off-by: default avatarRicardo Neri <ricardo.neri-calderon@linux.intel.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarBorislav Petkov <bp@suse.de>
Cc: Adan Hawthorn <adanhawthorn@gmail.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: ricardo.neri@intel.com
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Huang Rui <ray.huang@amd.com>
Cc: Qiaowei Ren <qiaowei.ren@intel.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: Nathan Howard <liverlint@gmail.com>
Cc: "Ravi V. Shankar" <ravi.v.shankar@intel.com>
Cc: Chris Metcalf <cmetcalf@mellanox.com>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Colin Ian King <colin.king@canonical.com>
Cc: Chen Yucong <slaoub@gmail.com>
Cc: Adam Buchbinder <adam.buchbinder@gmail.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Lorenzo Stoakes <lstoakes@gmail.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Joe Perches <joe@perches.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Link: https://lkml.kernel.org/r/1509135945-13762-6-git-send-email-ricardo.neri-calderon@linux.intel.com
parent ed40a104
...@@ -138,7 +138,7 @@ static int get_reg_offset(struct insn *insn, struct pt_regs *regs, ...@@ -138,7 +138,7 @@ 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) static void __user *mpx_get_addr_ref(struct insn *insn, struct pt_regs *regs)
{ {
unsigned long addr, base, indx; unsigned long addr = -1L, base, indx;
int addr_offset, base_offset, indx_offset; int addr_offset, base_offset, indx_offset;
insn_byte_t sib; insn_byte_t sib;
...@@ -149,17 +149,17 @@ static void __user *mpx_get_addr_ref(struct insn *insn, struct pt_regs *regs) ...@@ -149,17 +149,17 @@ static void __user *mpx_get_addr_ref(struct insn *insn, struct pt_regs *regs)
if (X86_MODRM_MOD(insn->modrm.value) == 3) { if (X86_MODRM_MOD(insn->modrm.value) == 3) {
addr_offset = get_reg_offset(insn, regs, REG_TYPE_RM); addr_offset = get_reg_offset(insn, regs, REG_TYPE_RM);
if (addr_offset < 0) if (addr_offset < 0)
goto out_err; goto out;
addr = regs_get_register(regs, addr_offset); addr = regs_get_register(regs, addr_offset);
} else { } else {
if (insn->sib.nbytes) { if (insn->sib.nbytes) {
base_offset = get_reg_offset(insn, regs, REG_TYPE_BASE); base_offset = get_reg_offset(insn, regs, REG_TYPE_BASE);
if (base_offset < 0) if (base_offset < 0)
goto out_err; goto out;
indx_offset = get_reg_offset(insn, regs, REG_TYPE_INDEX); indx_offset = get_reg_offset(insn, regs, REG_TYPE_INDEX);
if (indx_offset < 0) if (indx_offset < 0)
goto out_err; goto out;
base = regs_get_register(regs, base_offset); base = regs_get_register(regs, base_offset);
indx = regs_get_register(regs, indx_offset); indx = regs_get_register(regs, indx_offset);
...@@ -167,14 +167,13 @@ static void __user *mpx_get_addr_ref(struct insn *insn, struct pt_regs *regs) ...@@ -167,14 +167,13 @@ static void __user *mpx_get_addr_ref(struct insn *insn, struct pt_regs *regs)
} else { } else {
addr_offset = get_reg_offset(insn, regs, REG_TYPE_RM); addr_offset = get_reg_offset(insn, regs, REG_TYPE_RM);
if (addr_offset < 0) if (addr_offset < 0)
goto out_err; goto out;
addr = regs_get_register(regs, addr_offset); addr = regs_get_register(regs, addr_offset);
} }
addr += insn->displacement.value; addr += insn->displacement.value;
} }
out:
return (void __user *)addr; return (void __user *)addr;
out_err:
return (void __user *)-1;
} }
static int mpx_insn_decode(struct insn *insn, static int mpx_insn_decode(struct insn *insn,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment