Re: svn commit: r298736 - head/sys/amd64/amd64

2016-04-28 Thread Ivan Klymenko
On Thu, 28 Apr 2016 08:29:57 + (UTC)
Andriy Gapon  wrote:

> Author: avg
> Date: Thu Apr 28 08:29:57 2016
> New Revision: 298736
> URL: https://svnweb.freebsd.org/changeset/base/298736
> 
> Log:
>   ensure that initial local apic id is sane on AMD 10h systems
>   
>   Summary:
>   The Initial Local APIC ID is returned by CPUID function 1 (in EBX).
>   On AMD Family 10h systems the way that ID is built is controlled by
>   an MSR bit (InitApicIdCpuIdLo).  BKDG instructs BIOS to set it in a
>   certain way, but a BIOS can be buggy.  In that case the ID can
> confuse tools that use it, e.g. hwloc.
>   For example, on a system that I own real Local APIC IDs are
> configured as 0, 1, 2, 3, but IDs reported via CPUID.1 are 0, 0x40,
> 0x80, 0xc0. See: https://github.com/open-mpi/hwloc/issues/183
>   
>   Reviewed by:kib
>   MFC after:  2 weeks
>   Differential Revision: https://reviews.freebsd.org/D6060
> 
> Modified:
>   head/sys/amd64/amd64/initcpu.c
> 
> Modified: head/sys/amd64/amd64/initcpu.c
> ==
> --- head/sys/amd64/amd64/initcpu.cThu Apr 28 06:20:43
> 2016  (r298735) +++ head/sys/amd64/amd64/initcpu.cThu
> Apr 28 08:29:57 2016  (r298736) @@ -80,6 +80,19 @@
> init_amd(void) wrmsr(0xc0011029, rdmsr(0xc0011029) | 1);
>   break;
>   }
> +
> + /*
> +  * BIOS may fail to set InitApicIdCpuIdLo to 1 as it should
> per BKDG.
> +  * So, do it here or otherwise some tools could be confused
> by
> +  * Initial Local APIC ID reported with CPUID Function 1 in
> EBX.
> +  */
> + if (CPUID_TO_FAMILY(cpu_id) == 0x10) {
> + if ((cpu_feature2 & CPUID2_HV) == 0) {
> + msr = rdmsr(MSR_NB_CFG1);
> + msr |= (uint64_t)1 << 54;
> + wrmsr(MSR_NB_CFG1, msr);
> + }
> + }
>  }
>  
>  /*
> ___
...
--- initcpu.o ---
/usr/src/sys/amd64/amd64/initcpu.c:91:4: error: use of undeclared
identifier 'msr' msr = rdmsr(MSR_NB_CFG1);
^
/usr/src/sys/amd64/amd64/initcpu.c:92:4: error: use of undeclared
identifier 'msr' msr |= (uint64_t)1 << 54;
^
/usr/src/sys/amd64/amd64/initcpu.c:93:23: error: use of undeclared
identifier 'msr' wrmsr(MSR_NB_CFG1, msr);
   ^
3 errors generated.
*** [initcpu.o] Error code 1

make[2]: stopped in /media/da0s1/obj/usr/src/sys/mk11
1 error

make[2]: stopped in /media/da0s1/obj/usr/src/sys/mk11
*** [buildkernel] Error code 2

make[1]: stopped in /usr/src
1 error

make[1]: stopped in /usr/src
*** [buildkernel] Error code 2

make: stopped in /usr/src
1 error

make: stopped in /usr/src
___
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"


svn commit: r298736 - head/sys/amd64/amd64

2016-04-28 Thread Andriy Gapon
Author: avg
Date: Thu Apr 28 08:29:57 2016
New Revision: 298736
URL: https://svnweb.freebsd.org/changeset/base/298736

Log:
  ensure that initial local apic id is sane on AMD 10h systems
  
  Summary:
  The Initial Local APIC ID is returned by CPUID function 1 (in EBX).
  On AMD Family 10h systems the way that ID is built is controlled by
  an MSR bit (InitApicIdCpuIdLo).  BKDG instructs BIOS to set it in a
  certain way, but a BIOS can be buggy.  In that case the ID can confuse
  tools that use it, e.g. hwloc.
  For example, on a system that I own real Local APIC IDs are configured
  as 0, 1, 2, 3, but IDs reported via CPUID.1 are 0, 0x40, 0x80, 0xc0.
  See: https://github.com/open-mpi/hwloc/issues/183
  
  Reviewed by:  kib
  MFC after:2 weeks
  Differential Revision: https://reviews.freebsd.org/D6060

Modified:
  head/sys/amd64/amd64/initcpu.c

Modified: head/sys/amd64/amd64/initcpu.c
==
--- head/sys/amd64/amd64/initcpu.c  Thu Apr 28 06:20:43 2016
(r298735)
+++ head/sys/amd64/amd64/initcpu.c  Thu Apr 28 08:29:57 2016
(r298736)
@@ -80,6 +80,19 @@ init_amd(void)
wrmsr(0xc0011029, rdmsr(0xc0011029) | 1);
break;
}
+
+   /*
+* BIOS may fail to set InitApicIdCpuIdLo to 1 as it should per BKDG.
+* So, do it here or otherwise some tools could be confused by
+* Initial Local APIC ID reported with CPUID Function 1 in EBX.
+*/
+   if (CPUID_TO_FAMILY(cpu_id) == 0x10) {
+   if ((cpu_feature2 & CPUID2_HV) == 0) {
+   msr = rdmsr(MSR_NB_CFG1);
+   msr |= (uint64_t)1 << 54;
+   wrmsr(MSR_NB_CFG1, msr);
+   }
+   }
 }
 
 /*
___
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"