Re: [PATCH v3] x86: clear incorrectly forced X86_FEATURE_LAHF_LM flag

Kevin Winchester
2009-08-11T14:56:07Z

2009/8/11 Mikael Pettersson <mikpe@it.uu.se>:
> Kevin Winchester writes:
>  > Due to an erratum with certain AMD Athlon 64 processors, the BIOS may
>  > need to force enable the LAHF_LM capability.  Unfortunately, in at
>  > least one case, the BIOS does this even for processors that do not
>  > support the functionality.
>  >
>  > Add a specific check that will clear the feature bit for processors
>  > known not to support the LAHF/SAHF instructions.
>  >
>  > Signed-off-by: Kevin Winchester <kjwinchester@gmail.com>
>  > ---
>  >  arch/x86/kernel/cpu/amd.c |    7 +++++++
>  >  1 files changed, 7 insertions(+), 0 deletions(-)
>  >
>  > diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
>  > index e2485b0..63fddcd 100644
>  > --- a/arch/x86/kernel/cpu/amd.c
>  > +++ b/arch/x86/kernel/cpu/amd.c
>  > @@ -400,6 +400,13 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
>  >              level = cpuid_eax(1);
>  >              if((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58)
>  >                      set_cpu_cap(c, X86_FEATURE_REP_GOOD);
>  > +
>  > +            /*
>  > +             * Some BIOSes incorrectly force this feature, but only K8
>  > +             * revision D (model = 0x14) and later actually support it.
>  > +             */
>  > +            if (c->x86_model < 0x14)
>  > +                    clear_cpu_cap(c, X86_FEATURE_LAHF_LM);
>  >      }
>  >      if (c->x86 == 0x10 || c->x86 == 0x11)
>  >              set_cpu_cap(c, X86_FEATURE_REP_GOOD);
>
> But this only fixes /proc/cpuinfo, right?
>
> Since the BIOS apparently wrote some MSR to get LAHF_LM incorrectly
> reported by CPUID, would it be possible to also correct that MSR so
> that applications that execute CPUID get the correct feature flags?
>

Yes, this does only fix /proc/cpuinfo. The problem I was experiencing was
related to the 64-bit Adobe Flash plugin, which always uses the LAHF
instruction, regardless of the capabilities of the processor. Gentoo has
a special additional browser plugin that will basically emulate the LAHF
instruction when it gets an illegal instruction signal, but that plugin is not
installed if /proc/cpuinfo indicates that LAHF is supported.

Thus this patch precisely fixes my problem.

Other options would be, as you mention, to correct the MSR value, or even
to have the kernel emulate the instruction (if that is possible).

I would be happy to implement any other solution instead if it would
help others,
while continuing to solve my problem - but this was the simplest answer I had.

--
Kevin Winchester