lkml.org 
[lkml]   [2008]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] x86: better CPU identification without the CPUID
    On Sat, Sep 13, 2008 at 3:56 AM, Krzysztof Helt <krzysztof.h1@wp.pl> wrote:
    > From: Krzysztof Helt <krzysztof.h1@wp.pl>
    >
    > cpus without the CPUID instruction are identified
    > as general 386 or 486 while some cpus (mostly made
    > by Cyrix) provide c_identify function which identify
    > correctly older cpus using cpu specific registers).
    >
    > Cyrix cpus are even worse as 5x86 and 6x68 have
    > the CPUID instruction disabled. The CPUID is
    > enabled by the c_identify() but the c_identify
    > is only called when the CPUID is available.
    >
    > Fix this by calling the c_identify() for all known
    > cpu families if there is no the CPUID instruction
    >
    > Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
    > ---
    >
    > I have tested it on Cyrix Cx486DX2 cpu.
    >
    > I suspect that coma_bug field and mtrr support is not
    > set correctly for the Cyrix 6x86 family. I have not a cpu from
    > the Cyrix 6x68 family to test.
    >
    > The code path is (+ where the patch code is added)
    >
    > if (have_cpuid_p()) {
    >
    > }
    > + } else {
    > ...
    > + }
    >
    > so it does not affect cpus with the CPUID instruction.
    >
    > Regards,
    > Krzysztof
    >
    > diff -urp linux-mm/arch/x86/kernel/cpu/common.c linux-486/arch/x86/kernel/cpu/common.c
    > --- linux-mm/arch/x86/kernel/cpu/common.c 2008-09-05 23:38:20.295563396 +0200
    > +++ linux-486/arch/x86/kernel/cpu/common.c 2008-09-12 22:53:27.062265329 +0200
    > @@ -444,6 +444,17 @@ static void __cpuinit generic_identify(s
    >
    > init_scattered_cpuid_features(c);
    > detect_nopl(c);
    > + } else {
    > + int i;
    > + for (i = 0; i < X86_VENDOR_NUM; i++)
    > + if (cpu_devs[i] && cpu_devs[i]->c_identify) {
    > + c->x86_vendor_id[0] = 0;
    > + cpu_devs[i]->c_identify(c);
    > + if (c->x86_vendor_id[0]) {
    > + get_cpu_vendor(c, 0);
    > + break;
    > + }
    > + }
    > }
    > }
    >
    > --

    1. can you check tip/master?
    2. please check if you can add code in early_identify_cpu
    3. need to move c_identify_cpu calling to identify_cpu

    YH


    \
     
     \ /
      Last update: 2008-09-14 06:47    [W:0.025 / U:32.404 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site