x86: add is_f00f_bug helper to fault_32|64.c
PATCH 1/1 x86: add is_f00f_bug helper to fault_32|64.c
Further towards unifying these files, add another helper in same spirit as is_errata93. Add an #ifdef around the forward declaration of do_invalid_op to make it clear it is only needed in the one place.
--- arch/x86/mm/fault_32.c | 41 ++++++++++++++++++++++++----------------- arch/x86/mm/fault_64.c | 26 ++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 17 deletions(-)
arch/x86/mm/fault_32.c +24 -17
@@ -211,8 +211,6 @@ void dump_pagetable(unsigned long address)printk ("\n" ); } -void do_invalid_op (struct pt_regs *,unsigned long ); -static inline pmd_t *vmalloc_sync_one (pgd_t *pgd,unsigned long address) {unsigned index =pgd_index (address);
@@ -288,6 +286,28 @@ static int is_errata93(struct pt_regs *regs, unsigned long address)return 0 ; } +#ifdef CONFIG_X86_F00F_BUG +void do_invalid_op (struct pt_regs *,unsigned long ); +#endif + +static int is_f00f_bug (struct pt_regs *regs,unsigned long address) +{ +#ifdef CONFIG_X86_F00F_BUG +unsigned long nr; +/* +* Pentium F0 0F C7 C8 bug workaround. +*/ +if (boot_cpu_data.f00f_bug) { + nr = (address - idt_descr.address) >>3 ; + +if (nr ==6 ) { +do_invalid_op (regs,0 ); +return 1 ; + } + } +#endif +return 0 ; +}/* * Handle a fault on the vmalloc or module mapping area
@@ -570,21 +590,8 @@ bad_area_nosemaphore:return ; } -#ifdef CONFIG_X86_F00F_BUG -/* -* Pentium F0 0F C7 C8 bug workaround. -*/ -if (boot_cpu_data.f00f_bug) { -unsigned long nr; - - nr = (address - idt_descr.address) >>3 ; - -if (nr ==6 ) { -do_invalid_op (regs,0 ); -return ; - } - } -#endif +if (is_f00f_bug (regs, address)) +return ; no_context:/* Are we prepared to handle this kernel fault? */
arch/x86/mm/fault_64.c +26 -0
@@ -256,6 +256,29 @@ static int is_errata93(struct pt_regs *regs, unsigned long address)return 0 ; } +#ifdef CONFIG_X86_F00F_BUG +void do_invalid_op (struct pt_regs *,unsigned long ); +#endif + +static int is_f00f_bug (struct pt_regs *regs,unsigned long address) +{ +#ifdef CONFIG_X86_F00F_BUG +unsigned long nr; +/* +* Pentium F0 0F C7 C8 bug workaround. +*/ +if (boot_cpu_data.f00f_bug) { + nr = (address - idt_descr.address) >>3 ; + +if (nr ==6 ) { +do_invalid_op (regs,0 ); +return 1 ; + } + } +#endif +return 0 ; +} + static noinline void pgtable_bad(unsigned long address, struct pt_regs *regs,unsigned long error_code) {
@@ -572,6 +595,9 @@ bad_area_nosemaphore:return ; } +if (is_f00f_bug (regs, address)) +return ; + no_context:/* Are we prepared to handle this kernel fault? */ if (fixup_exception (regs))
Signature · 1 line
1.5.4.rc2.1164.g6451
arch/x86/mm/fault_32.c static int is_errata93(struct pt_regs *regs, unsigned long address) · line 296
Quoted 8 lines · Harvey Harrison
arch/x86/mm/fault_32.c +8
-0+#ifdef CONFIG_X86_F00F_BUG +void do_invalid_op (struct pt_regs *,unsigned long ); +#endif + +static int is_f00f_bug (struct pt_regs *regs,unsigned long address) +{ +#ifdef CONFIG_X86_F00F_BUG +unsigned long nr;
You can just put the prototype inside the function, you know...
H. Peter Anvin
reviewerQuoted 11 lines · Kyle McMartin
arch/x86/mm/fault_32.c static int is_errata93(struct pt_regs *regs, unsigned long address) · line 296
Quoted 8 lines · Harvey Harrison
arch/x86/mm/fault_32.c +8
-0+#ifdef CONFIG_X86_F00F_BUG +void do_invalid_op (struct pt_regs *,unsigned long ); +#endif + +static int is_f00f_bug (struct pt_regs *regs,unsigned long address) +{ +#ifdef CONFIG_X86_F00F_BUG +unsigned long nr;You can just put the prototype inside the function, you know...
You can also make the prototype unconditional, even if the function doesn't necessarily exist.
-hpa
PATCH v2 1/1 x86: add is_f00f_bug helper to fault_32|64.c
Quoted 13 lines · H. Peter Anvin
Quoted 11 lines · Kyle McMartin
Review
Quoted 8 lines · Harvey Harrison
(quoted diff) +8
-0+#ifdef CONFIG_X86_F00F_BUG +void do_invalid_op(struct pt_regs *, unsigned long); +#endif + +static int is_f00f_bug(struct pt_regs *regs, unsigned long address) +{ +#ifdef CONFIG_X86_F00F_BUG + unsigned long nr;You can just put the prototype inside the function, you know...
Quoted 2 lines
You can also make the prototype unconditional, even if the function doesn't necessarily exist.
I'll go with the unconditional prototype, the function will always exist, it's a bit hard to find as it's done with a macro in traps_32|64.c.
Harvey
From: Harvey Harrison <[email protected]>
Further towards unifying these files, add another helper in same spirit as is_errata93.
--- arch/x86/mm/fault_32.c | 39 ++++++++++++++++++++++----------------- arch/x86/mm/fault_64.c | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 17 deletions(-)
arch/x86/mm/fault_32.c +22 -17
@@ -211,8 +211,6 @@ void dump_pagetable(unsigned long address)printk ("\n" ); } -void do_invalid_op (struct pt_regs *,unsigned long ); -static inline pmd_t *vmalloc_sync_one (pgd_t *pgd,unsigned long address) {unsigned index =pgd_index (address);
@@ -288,6 +286,26 @@ static int is_errata93(struct pt_regs *regs, unsigned long address)return 0 ; } +void do_invalid_op (struct pt_regs *,unsigned long ); + +static int is_f00f_bug (struct pt_regs *regs,unsigned long address) +{ +#ifdef CONFIG_X86_F00F_BUG +unsigned long nr; +/* +* Pentium F0 0F C7 C8 bug workaround. +*/ +if (boot_cpu_data.f00f_bug) { + nr = (address - idt_descr.address) >>3 ; + +if (nr ==6 ) { +do_invalid_op (regs,0 ); +return 1 ; + } + } +#endif +return 0 ; +}/* * Handle a fault on the vmalloc or module mapping area
@@ -570,21 +588,8 @@ bad_area_nosemaphore:return ; } -#ifdef CONFIG_X86_F00F_BUG -/* -* Pentium F0 0F C7 C8 bug workaround. -*/ -if (boot_cpu_data.f00f_bug) { -unsigned long nr; - - nr = (address - idt_descr.address) >>3 ; - -if (nr ==6 ) { -do_invalid_op (regs,0 ); -return ; - } - } -#endif +if (is_f00f_bug (regs, address)) +return ; no_context:/* Are we prepared to handle this kernel fault? */
arch/x86/mm/fault_64.c +24 -0
@@ -256,6 +256,27 @@ static int is_errata93(struct pt_regs *regs, unsigned long address)return 0 ; } +void do_invalid_op (struct pt_regs *,unsigned long ); + +static int is_f00f_bug (struct pt_regs *regs,unsigned long address) +{ +#ifdef CONFIG_X86_F00F_BUG +unsigned long nr; +/* +* Pentium F0 0F C7 C8 bug workaround. +*/ +if (boot_cpu_data.f00f_bug) { + nr = (address - idt_descr.address) >>3 ; + +if (nr ==6 ) { +do_invalid_op (regs,0 ); +return 1 ; + } + } +#endif +return 0 ; +} + static noinline void pgtable_bad(unsigned long address, struct pt_regs *regs,unsigned long error_code) {
@@ -572,6 +593,9 @@ bad_area_nosemaphore:return ; } +if (is_f00f_bug (regs, address)) +return ; + no_context:/* Are we prepared to handle this kernel fault? */ if (fixup_exception (regs))
Signature · 1 line
1.5.4.rc2.1164.g6451