[tip:x86/apic] x86/fpu: Use bitfield accessors for desc_struct

2017-08-29 Thread tip-bot for Thomas Gleixner
Commit-ID:  718f5d0030da8669404dab873336b16c169b430b
Gitweb: http://git.kernel.org/tip/718f5d0030da8669404dab873336b16c169b430b
Author: Thomas Gleixner 
AuthorDate: Mon, 28 Aug 2017 08:47:39 +0200
Committer:  Ingo Molnar 
CommitDate: Tue, 29 Aug 2017 12:07:25 +0200

x86/fpu: Use bitfield accessors for desc_struct

desc_struct is a union of u32 fields and bitfields. The access to the u32
fields is done with magic macros.

Convert it to use the bitfields and replace the macro magic with parseable
inline functions.

Signed-off-by: Thomas Gleixner 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Brian Gerst 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Josh Poimboeuf 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Steven Rostedt 
Link: http://lkml.kernel.org/r/20170828064958.042406...@linutronix.de
Signed-off-by: Ingo Molnar 
---
 arch/x86/math-emu/fpu_entry.c   | 11 +-
 arch/x86/math-emu/fpu_system.h  | 48 +++--
 arch/x86/math-emu/get_address.c | 17 ---
 3 files changed, 51 insertions(+), 25 deletions(-)

diff --git a/arch/x86/math-emu/fpu_entry.c b/arch/x86/math-emu/fpu_entry.c
index 0203bae..d4a7df2 100644
--- a/arch/x86/math-emu/fpu_entry.c
+++ b/arch/x86/math-emu/fpu_entry.c
@@ -147,7 +147,7 @@ void math_emulate(struct math_emu_info *info)
}
 
code_descriptor = FPU_get_ldt_descriptor(FPU_CS);
-   if (SEG_D_SIZE(code_descriptor)) {
+   if (code_descriptor.d) {
/* The above test may be wrong, the book is not clear */
/* Segmented 32 bit protected mode */
addr_modes.default_mode = SEG32;
@@ -155,11 +155,10 @@ void math_emulate(struct math_emu_info *info)
/* 16 bit protected mode */
addr_modes.default_mode = PM16;
}
-   FPU_EIP += code_base = SEG_BASE_ADDR(code_descriptor);
-   code_limit = code_base
-   + (SEG_LIMIT(code_descriptor) +
-  1) * SEG_GRANULARITY(code_descriptor)
-   - 1;
+   FPU_EIP += code_base = seg_get_base(_descriptor);
+   code_limit = seg_get_limit(_descriptor) + 1;
+   code_limit *= seg_get_granularity(_descriptor);
+   code_limit += code_base - 1;
if (code_limit < code_base)
code_limit = 0x;
}
diff --git a/arch/x86/math-emu/fpu_system.h b/arch/x86/math-emu/fpu_system.h
index a179254..2319a25 100644
--- a/arch/x86/math-emu/fpu_system.h
+++ b/arch/x86/math-emu/fpu_system.h
@@ -34,17 +34,43 @@ static inline struct desc_struct 
FPU_get_ldt_descriptor(unsigned seg)
return ret;
 }
 
-#define SEG_D_SIZE(x)  ((x).b & (3 << 21))
-#define SEG_G_BIT(x)   ((x).b & (1 << 23))
-#define SEG_GRANULARITY(x) (((x).b & (1 << 23)) ? 4096 : 1)
-#define SEG_286_MODE(x)((x).b & ( 0xff00 | 0xf | (1 << 
23)))
-#define SEG_BASE_ADDR(s)   (((s).b & 0xff00) \
-| (((s).b & 0xff) << 16) | ((s).a >> 16))
-#define SEG_LIMIT(s)   (((s).b & 0xff) | ((s).a & 0x))
-#define SEG_EXECUTE_ONLY(s)(((s).b & ((1 << 11) | (1 << 9))) == (1 << 11))
-#define SEG_WRITE_PERM(s)  (((s).b & ((1 << 11) | (1 << 9))) == (1 << 9))
-#define SEG_EXPAND_DOWN(s) (((s).b & ((1 << 11) | (1 << 10))) \
-== (1 << 10))
+#define SEG_TYPE_WRITABLE  (1U << 1)
+#define SEG_TYPE_EXPANDS_DOWN  (1U << 2)
+#define SEG_TYPE_EXECUTE   (1U << 3)
+#define SEG_TYPE_EXPAND_MASK   (SEG_TYPE_EXPANDS_DOWN | SEG_TYPE_EXECUTE)
+#define SEG_TYPE_EXECUTE_MASK  (SEG_TYPE_WRITABLE | SEG_TYPE_EXECUTE)
+
+static inline unsigned long seg_get_base(struct desc_struct *d)
+{
+   unsigned long base = (unsigned long)d->base2 << 24;
+
+   return base | ((unsigned long)d->base1 << 16) | d->base0;
+}
+
+static inline unsigned long seg_get_limit(struct desc_struct *d)
+{
+   return ((unsigned long)d->limit << 16) | d->limit0;
+}
+
+static inline unsigned long seg_get_granularity(struct desc_struct *d)
+{
+   return d->g ? 4096 : 1;
+}
+
+static inline bool seg_expands_down(struct desc_struct *d)
+{
+   return (d->type & SEG_TYPE_EXPAND_MASK) == SEG_TYPE_EXPANDS_DOWN;
+}
+
+static inline bool seg_execute_only(struct desc_struct *d)
+{
+   return (d->type & SEG_TYPE_EXECUTE_MASK) == SEG_TYPE_EXECUTE;
+}
+
+static inline bool seg_writable(struct desc_struct *d)
+{
+   return (d->type & SEG_TYPE_EXECUTE_MASK) == SEG_TYPE_WRITABLE;
+}
 
 #define I387   (>thread.fpu.state)
 #define FPU_info   

[tip:x86/apic] x86/fpu: Use bitfield accessors for desc_struct

2017-08-29 Thread tip-bot for Thomas Gleixner
Commit-ID:  718f5d0030da8669404dab873336b16c169b430b
Gitweb: http://git.kernel.org/tip/718f5d0030da8669404dab873336b16c169b430b
Author: Thomas Gleixner 
AuthorDate: Mon, 28 Aug 2017 08:47:39 +0200
Committer:  Ingo Molnar 
CommitDate: Tue, 29 Aug 2017 12:07:25 +0200

x86/fpu: Use bitfield accessors for desc_struct

desc_struct is a union of u32 fields and bitfields. The access to the u32
fields is done with magic macros.

Convert it to use the bitfields and replace the macro magic with parseable
inline functions.

Signed-off-by: Thomas Gleixner 
Cc: Andy Lutomirski 
Cc: Borislav Petkov 
Cc: Brian Gerst 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Josh Poimboeuf 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Steven Rostedt 
Link: http://lkml.kernel.org/r/20170828064958.042406...@linutronix.de
Signed-off-by: Ingo Molnar 
---
 arch/x86/math-emu/fpu_entry.c   | 11 +-
 arch/x86/math-emu/fpu_system.h  | 48 +++--
 arch/x86/math-emu/get_address.c | 17 ---
 3 files changed, 51 insertions(+), 25 deletions(-)

diff --git a/arch/x86/math-emu/fpu_entry.c b/arch/x86/math-emu/fpu_entry.c
index 0203bae..d4a7df2 100644
--- a/arch/x86/math-emu/fpu_entry.c
+++ b/arch/x86/math-emu/fpu_entry.c
@@ -147,7 +147,7 @@ void math_emulate(struct math_emu_info *info)
}
 
code_descriptor = FPU_get_ldt_descriptor(FPU_CS);
-   if (SEG_D_SIZE(code_descriptor)) {
+   if (code_descriptor.d) {
/* The above test may be wrong, the book is not clear */
/* Segmented 32 bit protected mode */
addr_modes.default_mode = SEG32;
@@ -155,11 +155,10 @@ void math_emulate(struct math_emu_info *info)
/* 16 bit protected mode */
addr_modes.default_mode = PM16;
}
-   FPU_EIP += code_base = SEG_BASE_ADDR(code_descriptor);
-   code_limit = code_base
-   + (SEG_LIMIT(code_descriptor) +
-  1) * SEG_GRANULARITY(code_descriptor)
-   - 1;
+   FPU_EIP += code_base = seg_get_base(_descriptor);
+   code_limit = seg_get_limit(_descriptor) + 1;
+   code_limit *= seg_get_granularity(_descriptor);
+   code_limit += code_base - 1;
if (code_limit < code_base)
code_limit = 0x;
}
diff --git a/arch/x86/math-emu/fpu_system.h b/arch/x86/math-emu/fpu_system.h
index a179254..2319a25 100644
--- a/arch/x86/math-emu/fpu_system.h
+++ b/arch/x86/math-emu/fpu_system.h
@@ -34,17 +34,43 @@ static inline struct desc_struct 
FPU_get_ldt_descriptor(unsigned seg)
return ret;
 }
 
-#define SEG_D_SIZE(x)  ((x).b & (3 << 21))
-#define SEG_G_BIT(x)   ((x).b & (1 << 23))
-#define SEG_GRANULARITY(x) (((x).b & (1 << 23)) ? 4096 : 1)
-#define SEG_286_MODE(x)((x).b & ( 0xff00 | 0xf | (1 << 
23)))
-#define SEG_BASE_ADDR(s)   (((s).b & 0xff00) \
-| (((s).b & 0xff) << 16) | ((s).a >> 16))
-#define SEG_LIMIT(s)   (((s).b & 0xff) | ((s).a & 0x))
-#define SEG_EXECUTE_ONLY(s)(((s).b & ((1 << 11) | (1 << 9))) == (1 << 11))
-#define SEG_WRITE_PERM(s)  (((s).b & ((1 << 11) | (1 << 9))) == (1 << 9))
-#define SEG_EXPAND_DOWN(s) (((s).b & ((1 << 11) | (1 << 10))) \
-== (1 << 10))
+#define SEG_TYPE_WRITABLE  (1U << 1)
+#define SEG_TYPE_EXPANDS_DOWN  (1U << 2)
+#define SEG_TYPE_EXECUTE   (1U << 3)
+#define SEG_TYPE_EXPAND_MASK   (SEG_TYPE_EXPANDS_DOWN | SEG_TYPE_EXECUTE)
+#define SEG_TYPE_EXECUTE_MASK  (SEG_TYPE_WRITABLE | SEG_TYPE_EXECUTE)
+
+static inline unsigned long seg_get_base(struct desc_struct *d)
+{
+   unsigned long base = (unsigned long)d->base2 << 24;
+
+   return base | ((unsigned long)d->base1 << 16) | d->base0;
+}
+
+static inline unsigned long seg_get_limit(struct desc_struct *d)
+{
+   return ((unsigned long)d->limit << 16) | d->limit0;
+}
+
+static inline unsigned long seg_get_granularity(struct desc_struct *d)
+{
+   return d->g ? 4096 : 1;
+}
+
+static inline bool seg_expands_down(struct desc_struct *d)
+{
+   return (d->type & SEG_TYPE_EXPAND_MASK) == SEG_TYPE_EXPANDS_DOWN;
+}
+
+static inline bool seg_execute_only(struct desc_struct *d)
+{
+   return (d->type & SEG_TYPE_EXECUTE_MASK) == SEG_TYPE_EXECUTE;
+}
+
+static inline bool seg_writable(struct desc_struct *d)
+{
+   return (d->type & SEG_TYPE_EXECUTE_MASK) == SEG_TYPE_WRITABLE;
+}
 
 #define I387   (>thread.fpu.state)
 #define FPU_info   (I387->soft.info)
diff --git a/arch/x86/math-emu/get_address.c b/arch/x86/math-emu/get_address.c
index b8ef9f9d2..c48967c 100644
--- a/arch/x86/math-emu/get_address.c
+++ b/arch/x86/math-emu/get_address.c
@@ -159,17 +159,18 @@ static long pm_address(u_char FPU_modrm,