mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 15:58:47 +00:00
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: Dave 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.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
633d54c47a
commit
1126cb4535
@ -141,20 +141,37 @@ struct ymmh_struct {
|
||||
};
|
||||
|
||||
/* Intel MPX support: */
|
||||
struct bndreg {
|
||||
|
||||
struct mpx_bndreg {
|
||||
u64 lower_bound;
|
||||
u64 upper_bound;
|
||||
} __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 bndstatus;
|
||||
} __packed;
|
||||
|
||||
struct mpx_struct {
|
||||
struct bndreg bndreg[4];
|
||||
struct bndcsr bndcsr;
|
||||
};
|
||||
/*
|
||||
* The BNDCSR state is padded out to be 64-bytes in size.
|
||||
*/
|
||||
struct mpx_bndcsr_state {
|
||||
union {
|
||||
struct mpx_bndcsr bndcsr;
|
||||
u8 pad_to_64_bytes[64];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct xstate_header {
|
||||
u64 xfeatures;
|
||||
|
@ -11,7 +11,7 @@
|
||||
TRACE_EVENT(mpx_bounds_register_exception,
|
||||
|
||||
TP_PROTO(void *addr_referenced,
|
||||
const struct bndreg *bndreg),
|
||||
const struct mpx_bndreg *bndreg),
|
||||
TP_ARGS(addr_referenced, bndreg),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
@ -44,7 +44,7 @@ TRACE_EVENT(mpx_bounds_register_exception,
|
||||
|
||||
TRACE_EVENT(bounds_exception_mpx,
|
||||
|
||||
TP_PROTO(const struct bndcsr *bndcsr),
|
||||
TP_PROTO(const struct mpx_bndcsr *bndcsr),
|
||||
TP_ARGS(bndcsr),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
@ -116,7 +116,8 @@ TRACE_EVENT(mpx_new_bounds_table,
|
||||
/*
|
||||
* 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)
|
||||
|
||||
dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)
|
||||
{
|
||||
const struct bndcsr *bndcsr;
|
||||
const struct mpx_bndcsr *bndcsr;
|
||||
siginfo_t *info;
|
||||
|
||||
RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
|
||||
|
@ -237,7 +237,8 @@ bad_opcode:
|
||||
*/
|
||||
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;
|
||||
struct insn insn;
|
||||
uint8_t bndregno;
|
||||
@ -264,7 +265,7 @@ siginfo_t *mpx_generate_siginfo(struct pt_regs *regs)
|
||||
goto err_out;
|
||||
}
|
||||
/* now go select the individual register in the set of 4 */
|
||||
bndreg = &bndregs[bndregno];
|
||||
bndreg = &bndregs->bndreg[bndregno];
|
||||
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info) {
|
||||
@ -306,7 +307,7 @@ err_out:
|
||||
|
||||
static __user void *mpx_get_bounds_dir(void)
|
||||
{
|
||||
const struct bndcsr *bndcsr;
|
||||
const struct mpx_bndcsr *bndcsr;
|
||||
|
||||
if (!cpu_feature_enabled(X86_FEATURE_MPX))
|
||||
return MPX_INVALID_BOUNDS_DIR;
|
||||
@ -489,7 +490,7 @@ out_unmap:
|
||||
static int do_mpx_bt_fault(void)
|
||||
{
|
||||
unsigned long bd_entry, bd_base;
|
||||
const struct bndcsr *bndcsr;
|
||||
const struct mpx_bndcsr *bndcsr;
|
||||
struct mm_struct *mm = current->mm;
|
||||
|
||||
bndcsr = get_xsave_field_ptr(XFEATURE_MASK_BNDCSR);
|
||||
|
Loading…
x
Reference in New Issue
Block a user