lkml.org 
[lkml]   [2017]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 7/7] x86/boot/32: Rewrite test_wp_bit()
    Date
    This code seems to be very old and has gotten only minor updates.
    Nowadays we have a shiny function probe_kernel_write() that does
    more or less exactly what we need. Use it.

    While we're at it, remove cpuinfo_x86::wp_works_ok, since we panic
    on kernels where wp doesn't work okay.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    ---
    arch/x86/include/asm/processor.h | 2 --
    arch/x86/kernel/cpu/proc.c | 5 ++---
    arch/x86/kernel/setup.c | 2 --
    arch/x86/mm/init_32.c | 44 ++++++++--------------------------------
    arch/x86/xen/enlighten.c | 1 -
    5 files changed, 11 insertions(+), 43 deletions(-)

    diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
    index edf42c4ac8c8..2c7695c9c684 100644
    --- a/arch/x86/include/asm/processor.h
    +++ b/arch/x86/include/asm/processor.h
    @@ -90,8 +90,6 @@ struct cpuinfo_x86 {
    __u8 x86_model;
    __u8 x86_mask;
    #ifdef CONFIG_X86_32
    - char wp_works_ok; /* It doesn't on 386's */
    -
    /* Problems on some 486Dx4's and old 386's: */
    char rfu;
    char pad0;
    diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c
    index 18ca99f2798b..6df621ae62a7 100644
    --- a/arch/x86/kernel/cpu/proc.c
    +++ b/arch/x86/kernel/cpu/proc.c
    @@ -31,14 +31,13 @@ static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c)
    "fpu\t\t: %s\n"
    "fpu_exception\t: %s\n"
    "cpuid level\t: %d\n"
    - "wp\t\t: %s\n",
    + "wp\t\t: yes\n",
    static_cpu_has_bug(X86_BUG_FDIV) ? "yes" : "no",
    static_cpu_has_bug(X86_BUG_F00F) ? "yes" : "no",
    static_cpu_has_bug(X86_BUG_COMA) ? "yes" : "no",
    static_cpu_has(X86_FEATURE_FPU) ? "yes" : "no",
    static_cpu_has(X86_FEATURE_FPU) ? "yes" : "no",
    - c->cpuid_level,
    - c->wp_works_ok ? "yes" : "no");
    + c->cpuid_level);
    }
    #else
    static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c)
    diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
    index 56b1177155db..462b7c69443d 100644
    --- a/arch/x86/kernel/setup.c
    +++ b/arch/x86/kernel/setup.c
    @@ -175,11 +175,9 @@ static struct resource bss_resource = {
    #ifdef CONFIG_X86_32
    /* cpu data as detected by the assembly code in head.S */
    struct cpuinfo_x86 new_cpu_data = {
    - .wp_works_ok = -1,
    };
    /* common cpu data for all cpus */
    struct cpuinfo_x86 boot_cpu_data __read_mostly = {
    - .wp_works_ok = -1,
    };
    EXPORT_SYMBOL(boot_cpu_data);

    diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c
    index 5ed3c141bbd5..097089a5e4d5 100644
    --- a/arch/x86/mm/init_32.c
    +++ b/arch/x86/mm/init_32.c
    @@ -56,8 +56,6 @@

    unsigned long highstart_pfn, highend_pfn;

    -static noinline int do_test_wp_bit(void);
    -
    bool __read_mostly __vmalloc_start_set = false;

    /*
    @@ -726,20 +724,21 @@ void __init paging_init(void)
    */
    static void __init test_wp_bit(void)
    {
    + char z = 0;
    +
    printk(KERN_INFO
    "Checking if this processor honours the WP bit even in supervisor mode...");

    - /* Any page-aligned address will do, the test is non-destructive */
    - __set_fixmap(FIX_WP_TEST, __pa(&swapper_pg_dir), PAGE_KERNEL_RO);
    - boot_cpu_data.wp_works_ok = do_test_wp_bit();
    - clear_fixmap(FIX_WP_TEST);
    + __set_fixmap(FIX_WP_TEST, __pa_symbol(empty_zero_page), PAGE_KERNEL_RO);

    - if (!boot_cpu_data.wp_works_ok) {
    + if (probe_kernel_write((char *)fix_to_virt(FIX_WP_TEST), &z, 1) == 0) {
    printk(KERN_CONT "No.\n");
    panic("Linux doesn't support CPUs with broken WP.");
    - } else {
    - printk(KERN_CONT "Ok.\n");
    }
    +
    + clear_fixmap(FIX_WP_TEST);
    +
    + printk(KERN_CONT "Ok.\n");
    }

    void __init mem_init(void)
    @@ -821,8 +820,7 @@ void __init mem_init(void)
    BUG_ON(VMALLOC_START >= VMALLOC_END);
    BUG_ON((unsigned long)high_memory > VMALLOC_START);

    - if (boot_cpu_data.wp_works_ok < 0)
    - test_wp_bit();
    + test_wp_bit();
    }

    #ifdef CONFIG_MEMORY_HOTPLUG
    @@ -850,30 +848,6 @@ int arch_remove_memory(u64 start, u64 size)
    #endif
    #endif

    -/*
    - * This function cannot be __init, since exceptions don't work in that
    - * section. Put this after the callers, so that it cannot be inlined.
    - */
    -static noinline int do_test_wp_bit(void)
    -{
    - char tmp_reg;
    - int flag;
    -
    - __asm__ __volatile__(
    - " movb %0, %1 \n"
    - "1: movb %1, %0 \n"
    - " xorl %2, %2 \n"
    - "2: \n"
    - _ASM_EXTABLE(1b,2b)
    - :"=m" (*(char *)fix_to_virt(FIX_WP_TEST)),
    - "=q" (tmp_reg),
    - "=r" (flag)
    - :"2" (1)
    - :"memory");
    -
    - return flag;
    -}
    -
    int kernel_set_to_readonly __read_mostly;

    void set_kernel_text_rw(void)
    diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
    index 4951fcf95143..6efa0cc425a2 100644
    --- a/arch/x86/xen/enlighten.c
    +++ b/arch/x86/xen/enlighten.c
    @@ -1595,7 +1595,6 @@ asmlinkage __visible void __init xen_start_kernel(void)
    /* set up basic CPUID stuff */
    cpu_detect(&new_cpu_data);
    set_cpu_cap(&new_cpu_data, X86_FEATURE_FPU);
    - new_cpu_data.wp_works_ok = 1;
    new_cpu_data.x86_capability[CPUID_1_EDX] = cpuid_edx(1);
    #endif

    --
    2.9.3
    \
     
     \ /
      Last update: 2017-03-22 22:34    [W:5.095 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site