Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 06 Mar 1998 09:17:41 -0800
From:      Tom Pavel <pavel@SLAC.Stanford.EDU>
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   i386/5932: perfmon kernel code should check for non-Intel CPUs
Message-ID:  <199803061717.JAA03669@mailbox.SLAC.Stanford.EDU>

next in thread | raw e-mail | index | archive | help

>Number:         5932
>Category:       i386
>Synopsis:       perfmon kernel code should check for non-Intel CPUs
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:
>Keywords:
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Mar  6 09:20:01 PST 1998
>Last-Modified:
>Originator:     Tom Pavel
>Organization:
Stanford Linear Accelerator Center
>Release:        FreeBSD 2.2.5-STABLE i386
>Environment:


>Description:

Before I researched the fact that AMD does not actually implement any
of the msr 0x11 performance counters in the K6 that Intel does in the
Pentium and PPro, I thought I would try out the perfmon program in
/usr/share/examples/perfmon on my K6 machine.  This brought my machine
to an immediate halt.  I figured it out soon enough, but this case
should probably be caught in the perfmon code...


>How-To-Repeat:

Do any of the PMIO ioctl() calls on /dev/perfmon on an AMD K6 machine.
 

>Fix:
	
I think you just need to check that the CPU is actually an Intel one,
rather than checking for the generic 586/686 cpu_class.  Here is a
possible fix:

bozon[111]% diff -c /usr/src/sys/i386/i386/perfmon.c-ORIG  perfmon.c
*** /usr/src/sys/i386/i386/perfmon.c-ORIG       Thu Oct 10 03:18:48 1996
--- perfmon.c   Thu Mar  5 23:34:38 1998
***************
*** 38,43 ****
--- 38,44 ----
  
  #include <machine/cpu.h>
  #include <machine/cputypes.h>
+ #include <machine/md_var.h>
  #include <machine/clock.h>
  #include <machine/perfmon.h>
  
***************
*** 57,62 ****
--- 58,71 ----
  void
  perfmon_init(void)
  {
+       /* Unfortunately, all of the perfmon registers only exist on
+        * "GenuineIntel" Pentiums and P6's.  Trying to use msr 0x11 on my K6
+        * cause a seize-up... (pavel 5-Mar-1998)  */
+       if (strcmp(cpu_vendor, "GenuineIntel") != 0) {
+           perfmon_cpuok = 0;
+           return;
+       }
+ 
        switch(cpu_class) {
        case CPUCLASS_586:
                perfmon_cpuok = 1;


Tom Pavel

Stanford Linear Accelerator Center
pavel@slac.stanford.edu                 http://www.slac.stanford.edu/~pavel/
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199803061717.JAA03669>