Commit 1126cb45 authored by Dave Hansen's avatar Dave Hansen Committed by Ingo Molnar

x86/fpu/mpx: Rework MPX 'xstate' types

MPX includes two separate "extended state components".  There is
no real need to have an 'mpx_struct' because we never really
manage the states together.

We also separate out the actual data in 'mpx_bndcsr_state' from
the padding.  We will shortly be checking the state sizes
against our structures and need them to match.  For consistency,
we also ensure to prefix these types with 'mpx_'.

Lastly, we add some comments to mirror some of the descriptions
in the Intel documents (SDM) of the various state components.
Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Cc: dave@sr71.net
Cc: linux-kernel@vger.kernel.org
Link: http://lkml.kernel.org/r/20150902233129.384B73EB@viggo.jf.intel.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 633d54c4
...@@ -141,20 +141,37 @@ struct ymmh_struct { ...@@ -141,20 +141,37 @@ struct ymmh_struct {
}; };
/* Intel MPX support: */ /* Intel MPX support: */
struct bndreg {
struct mpx_bndreg {
u64 lower_bound; u64 lower_bound;
u64 upper_bound; u64 upper_bound;
} __packed; } __packed;
/*
* State component 3 is used for the 4 128-bit bounds registers
*/
struct mpx_bndreg_state {
struct mpx_bndreg bndreg[4];
} __packed;
struct bndcsr { /*
* State component 4 is used for the 64-bit user-mode MPX
* configuration register BNDCFGU and the 64-bit MPX status
* register BNDSTATUS. We call the pair "BNDCSR".
*/
struct mpx_bndcsr {
u64 bndcfgu; u64 bndcfgu;
u64 bndstatus; u64 bndstatus;
} __packed; } __packed;
struct mpx_struct { /*
struct bndreg bndreg[4]; * The BNDCSR state is padded out to be 64-bytes in size.
struct bndcsr bndcsr; */
}; struct mpx_bndcsr_state {
union {
struct mpx_bndcsr bndcsr;
u8 pad_to_64_bytes[64];
};
} __packed;
struct xstate_header { struct xstate_header {
u64 xfeatures; u64 xfeatures;
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
TRACE_EVENT(mpx_bounds_register_exception, TRACE_EVENT(mpx_bounds_register_exception,
TP_PROTO(void *addr_referenced, TP_PROTO(void *addr_referenced,
const struct bndreg *bndreg), const struct mpx_bndreg *bndreg),
TP_ARGS(addr_referenced, bndreg), TP_ARGS(addr_referenced, bndreg),
TP_STRUCT__entry( TP_STRUCT__entry(
...@@ -44,7 +44,7 @@ TRACE_EVENT(mpx_bounds_register_exception, ...@@ -44,7 +44,7 @@ TRACE_EVENT(mpx_bounds_register_exception,
TRACE_EVENT(bounds_exception_mpx, TRACE_EVENT(bounds_exception_mpx,
TP_PROTO(const struct bndcsr *bndcsr), TP_PROTO(const struct mpx_bndcsr *bndcsr),
TP_ARGS(bndcsr), TP_ARGS(bndcsr),
TP_STRUCT__entry( TP_STRUCT__entry(
...@@ -116,7 +116,8 @@ TRACE_EVENT(mpx_new_bounds_table, ...@@ -116,7 +116,8 @@ TRACE_EVENT(mpx_new_bounds_table,
/* /*
* This gets used outside of MPX-specific code, so we need a stub. * This gets used outside of MPX-specific code, so we need a stub.
*/ */
static inline void trace_bounds_exception_mpx(const struct bndcsr *bndcsr) static inline
void trace_bounds_exception_mpx(const struct mpx_bndcsr *bndcsr)
{ {
} }
......
...@@ -361,7 +361,7 @@ dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code) ...@@ -361,7 +361,7 @@ dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
dotraplinkage void do_bounds(struct pt_regs *regs, long error_code) dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)
{ {
const struct bndcsr *bndcsr; const struct mpx_bndcsr *bndcsr;
siginfo_t *info; siginfo_t *info;
RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
......
...@@ -237,7 +237,8 @@ static int mpx_insn_decode(struct insn *insn, ...@@ -237,7 +237,8 @@ static int mpx_insn_decode(struct insn *insn,
*/ */
siginfo_t *mpx_generate_siginfo(struct pt_regs *regs) siginfo_t *mpx_generate_siginfo(struct pt_regs *regs)
{ {
const struct bndreg *bndregs, *bndreg; const struct mpx_bndreg_state *bndregs;
const struct mpx_bndreg *bndreg;
siginfo_t *info = NULL; siginfo_t *info = NULL;
struct insn insn; struct insn insn;
uint8_t bndregno; uint8_t bndregno;
...@@ -264,7 +265,7 @@ siginfo_t *mpx_generate_siginfo(struct pt_regs *regs) ...@@ -264,7 +265,7 @@ siginfo_t *mpx_generate_siginfo(struct pt_regs *regs)
goto err_out; goto err_out;
} }
/* now go select the individual register in the set of 4 */ /* now go select the individual register in the set of 4 */
bndreg = &bndregs[bndregno]; bndreg = &bndregs->bndreg[bndregno];
info = kzalloc(sizeof(*info), GFP_KERNEL); info = kzalloc(sizeof(*info), GFP_KERNEL);
if (!info) { if (!info) {
...@@ -306,7 +307,7 @@ siginfo_t *mpx_generate_siginfo(struct pt_regs *regs) ...@@ -306,7 +307,7 @@ siginfo_t *mpx_generate_siginfo(struct pt_regs *regs)
static __user void *mpx_get_bounds_dir(void) static __user void *mpx_get_bounds_dir(void)
{ {
const struct bndcsr *bndcsr; const struct mpx_bndcsr *bndcsr;
if (!cpu_feature_enabled(X86_FEATURE_MPX)) if (!cpu_feature_enabled(X86_FEATURE_MPX))
return MPX_INVALID_BOUNDS_DIR; return MPX_INVALID_BOUNDS_DIR;
...@@ -489,7 +490,7 @@ static int allocate_bt(struct mm_struct *mm, long __user *bd_entry) ...@@ -489,7 +490,7 @@ static int allocate_bt(struct mm_struct *mm, long __user *bd_entry)
static int do_mpx_bt_fault(void) static int do_mpx_bt_fault(void)
{ {
unsigned long bd_entry, bd_base; unsigned long bd_entry, bd_base;
const struct bndcsr *bndcsr; const struct mpx_bndcsr *bndcsr;
struct mm_struct *mm = current->mm; struct mm_struct *mm = current->mm;
bndcsr = get_xsave_field_ptr(XFEATURE_MASK_BNDCSR); bndcsr = get_xsave_field_ptr(XFEATURE_MASK_BNDCSR);
......
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