From: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
To: Ingo Molnar <mingo@redhat.com>,
Thomas Gleixner <tglx@linutronix.de>,
"H. Peter Anvin" <hpa@zytor.com>,
Andy Lutomirski <luto@kernel.org>, Borislav Petkov <bp@suse.de>
Cc: Peter Zijlstra <peterz@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
Brian Gerst <brgerst@gmail.com>,
Chris Metcalf <cmetcalf@mellanox.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Liang Z Li <liang.z.li@intel.com>,
Masami Hiramatsu <mhiramat@kernel.org>,
Huang Rui <ray.huang@amd.com>, Jiri Slaby <jslaby@suse.cz>,
Jonathan Corbet <corbet@lwn.net>,
"Michael S. Tsirkin" <mst@redhat.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
Vlastimil Babka <vbabka@suse.cz>, Chen Yucong <slaoub@gmail.com>,
Alexandre Julliard <julliard@winehq.org>,
Stas Sergeev <stsp@list.ru>, Fenghua Yu <fenghua.yu@intel.com>,
"Ravi V. Shankar" <ravi.v.shankar@intel.com>,
Shuah Khan <shuah@kernel.org>,
linux-kernel@vger.kern
Subject: [PATCH v4 07/17] x86/insn-eval: Add utility function to get segment descriptor base address
Date: Wed, 22 Feb 2017 22:36:56 -0800 [thread overview]
Message-ID: <20170223063706.71554-8-ricardo.neri-calderon@linux.intel.com> (raw)
In-Reply-To: <20170223063706.71554-1-ricardo.neri-calderon@linux.intel.com>
With segmentation, the base address of the segment descriptor is needed
to compute a linear address. The segment descriptor used in the address
computation depends on either any segment override prefixes in the in the
instruction or the default segment determined by the registers involved
in the address computation. Thus, both the instruction as well as the
register (specified as the offset from the base of pt_regs) are given as
inputs. Furthermore, if insn is null, overrides are ignored; this is
useful when, for instance, obtaining the base address of the instruction
pointer (the code segment is always used).
The segment selector is determined by get_seg_selector with the inputs
described above. Once the selector is known the base address is
determined. In protected mode, the selector is used to obtain the segment
descriptor and then its base address. In virtual-8086 mode, the base
address is computed as the value of the segment selector shifted 4
positions to the left.
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Adam Buchbinder <adam.buchbinder@gmail.com>
Cc: Colin Ian King <colin.king@canonical.com>
Cc: Lorenzo Stoakes <lstoakes@gmail.com>
Cc: Qiaowei Ren <qiaowei.ren@intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Thomas Garnier <thgarnie@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Borislav Petkov <bp@suse.de>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Ravi V. Shankar <ravi.v.shankar@intel.com>
Cc: x86@kernel.org
Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
---
arch/x86/include/asm/insn-eval.h | 2 ++
arch/x86/lib/insn-eval.c | 42 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 44 insertions(+)
diff --git a/arch/x86/include/asm/insn-eval.h b/arch/x86/include/asm/insn-eval.h
index 754211b..0de3083 100644
--- a/arch/x86/include/asm/insn-eval.h
+++ b/arch/x86/include/asm/insn-eval.h
@@ -15,5 +15,7 @@ void __user *insn_get_addr_ref(struct insn *insn, struct pt_regs *regs);
int insn_get_reg_offset_modrm_rm(struct insn *insn, struct pt_regs *regs);
int insn_get_reg_offset_sib_base(struct insn *insn, struct pt_regs *regs);
int insn_get_reg_offset_sib_base(struct insn *insn, struct pt_regs *regs);
+unsigned long insn_get_seg_base(struct pt_regs *regs, struct insn *insn,
+ int regoff);
#endif /* _ASM_X86_INSN_EVAL_H */
diff --git a/arch/x86/lib/insn-eval.c b/arch/x86/lib/insn-eval.c
index e6d5dfb..4e3f797 100644
--- a/arch/x86/lib/insn-eval.c
+++ b/arch/x86/lib/insn-eval.c
@@ -323,6 +323,48 @@ static int get_desc(unsigned short seg, struct desc_struct **desc)
}
/**
+ * insn_get_seg_base() - Obtain base address contained in descriptor
+ * @regs: Set of registers containing the segment selector
+ * @insn: Instruction structure with selector override prefixes
+ * @regoff: Operand offset, in pt_regs, of which the selector is needed
+ *
+ * Obtain the base address of the segment descriptor as indicated by either any
+ * segment override prefixes contained in insn or the default segment applicable
+ * to the register indicated by regoff. regoff is specified as the offset in
+ * bytes from the base of pt_regs. If insn is not null and contain any segment
+ * override prefixes, the override is used instead of the default segment.
+ *
+ * Return: In protected mode, 0 if in CONFIG_X86_64, -1L in case of error,
+ * or the base address indicated in the selected segment descriptor. In
+ * virtual-8086, the segment selector shifted four positions to the right.
+ */
+unsigned long insn_get_seg_base(struct pt_regs *regs, struct insn *insn,
+ int regoff)
+{
+ struct desc_struct *desc;
+ unsigned short seg;
+ int ret;
+
+ seg = get_segment_selector(regs, insn, regoff);
+
+ if (v8086_mode(regs))
+ /*
+ * Base is simply the segment selector sifted 4
+ * positions to the right.
+ */
+ return (unsigned long)(seg << 4);
+
+ /* 64-bit mode */
+ if (!seg)
+ return 0;
+ ret = get_desc(seg, &desc);
+ if (ret)
+ return -1L;
+
+ return get_desc_base(desc);
+}
+
+/**
* insn_get_reg_offset_modrm_rm - Obtain register in r/m part of ModRM byte
* @insn: Instruction structure containing the ModRM byte
* @regs: Set of registers indicated by the ModRM byte
--
2.9.3
next prev parent reply other threads:[~2017-02-23 6:36 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-23 6:36 [PATCH v4 00/17] x86: Enable User-Mode Instruction Prevention Ricardo Neri
2017-02-23 6:36 ` [PATCH v4 01/17] x86/mpx: Do not use SIB index if index points to R/ESP Ricardo Neri
2017-02-23 7:24 ` Peter Zijlstra
2017-02-23 9:50 ` Paul Crawford
2017-02-23 12:47 ` Coding style vs legibility [was Re: [PATCH v4 01/17] x86/mpx: Do not use SIB index if index points to R/ESP] Mouse
2017-02-23 22:17 ` [PATCH v4 01/17] x86/mpx: Do not use SIB index if index points to R/ESP Ricardo Neri
2017-02-24 2:33 ` Joe Perches
2017-02-24 2:41 ` Ricardo Neri
2017-02-24 14:47 ` Nathan Howard
2017-02-24 19:07 ` Ricardo Neri
2017-02-24 15:00 ` Adan Hawthorn
2017-02-23 6:36 ` [PATCH v4 02/17] x86/mpx: Do not use R/EBP as base in the SIB byte with Mod = 0 Ricardo Neri
2017-02-23 6:36 ` [PATCH v4 03/17] x86/mpx, x86/insn: Relocate insn util functions to a new insn-kernel Ricardo Neri
2017-02-23 10:54 ` kbuild test robot
2017-02-23 22:18 ` Ricardo Neri
2017-02-23 6:36 ` [PATCH v4 04/17] x86/insn-eval: Add utility functions to get register offsets Ricardo Neri
2017-02-23 6:36 ` [PATCH v4 05/17] x86/insn-eval: Add utility function to get segment selector Ricardo Neri
2017-02-23 6:36 ` [PATCH v4 06/17] x86/insn-eval: Add utility function to get segment descriptor Ricardo Neri
2017-02-23 6:36 ` Ricardo Neri [this message]
2017-02-23 6:36 ` [PATCH v4 08/17] x86/insn-eval: Add functions to get default operand and address sizes Ricardo Neri
2017-02-23 6:36 ` [PATCH v4 09/17] x86/insn-eval: Do not use R/EBP as base if mod in ModRM is zero Ricardo Neri
2017-02-23 6:36 ` [PATCH v4 10/17] insn/eval: Incorporate segment base in address computation Ricardo Neri
2017-02-23 6:37 ` [PATCH v4 11/17] x86/insn-eval: Add support to resolve 16-bit addressing encodings Ricardo Neri
2017-02-23 6:37 ` [PATCH v4 12/17] x86/cpufeature: Add User-Mode Instruction Prevention definitions Ricardo Neri
2017-02-23 6:37 ` [PATCH v4 13/17] x86: Add emulation code for UMIP instructions Ricardo Neri
2017-02-23 6:37 ` [PATCH v4 14/17] x86/umip: Force a page fault when unable to copy emulated result to user Ricardo Neri
2017-02-23 6:37 ` [PATCH v4 15/17] x86/traps: Fixup general protection faults caused by UMIP Ricardo Neri
2017-02-23 9:27 ` Peter Zijlstra
2017-02-23 22:15 ` Ricardo Neri
2017-02-24 19:11 ` Andy Lutomirski
2017-02-24 19:36 ` Ricardo Neri
2017-02-24 19:45 ` H. Peter Anvin
2017-02-23 6:37 ` [PATCH v4 16/17] x86: Enable User-Mode Instruction Prevention Ricardo Neri
2017-02-23 6:37 ` [PATCH v4 17/17] selftests/x86: Add tests for " Ricardo Neri
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170223063706.71554-8-ricardo.neri-calderon@linux.intel.com \
--to=ricardo.neri-calderon@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=bp@suse.de \
--cc=brgerst@gmail.com \
--cc=cmetcalf@mellanox.com \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=fenghua.yu@intel.com \
--cc=hpa@zytor.com \
--cc=jslaby@suse.cz \
--cc=julliard@winehq.org \
--cc=liang.z.li@intel.com \
--cc=linux-kernel@vger.kern \
--cc=luto@kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=mst@redhat.com \
--cc=paul.gortmaker@windriver.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=ravi.v.shankar@intel.com \
--cc=ray.huang@amd.com \
--cc=shuah@kernel.org \
--cc=slaoub@gmail.com \
--cc=stsp@list.ru \
--cc=tglx@linutronix.de \
--cc=vbabka@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox