kern/65627: Patch to store P3 serial number in sysctl
Gavin Atkinson
gavin at ury.york.ac.uk
Fri Apr 16 08:20:21 PDT 2004
>Number: 65627
>Category: kern
>Synopsis: Patch to store P3 serial number in sysctl
>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 Apr 16 08:20:21 PDT 2004
>Closed-Date:
>Last-Modified:
>Originator: Gavin Atkinson
>Release: FreeBSD 5.2-CURRENT i386
>Organization:
>Environment:
System: FreeBSD buffy.york.ac.uk 5.2-CURRENT FreeBSD 5.2-CURRENT #7: Tue Apr 13 19:45:13 BST 2004 root at buffy.york.ac.uk:/usr/obj/usr/src/sys/GENERIC i386
>Description:
Pentium III processors have a serial number stored within them.
If not disabled, this can be used to license software against, etc.
This patch provides userland access to the serial number. It also includes
a printf to show the serial number when bootverbose is set, but it may be
preferable to not include that.
>How-To-Repeat:
n/a
>Fix:
(Patch also at http://www.devrandom.co.uk/freebsd/psn.diff)
--- sys/i386/i386/identcpu.c.old Fri Apr 9 18:00:03 2004
+++ sys/i386/i386/identcpu.c Tue Apr 13 22:17:50 2004
@@ -94,6 +94,13 @@
SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD,
cpu_model, 0, "Machine model");
+SYSCTL_NODE(_hw, OID_AUTO, cpu0, CTLFLAG_RD,
+ 0, "CPU 0 Information");
+
+static char cpu_serial[32];
+SYSCTL_STRING(_hw_cpu0, OID_AUTO, serial, CTLFLAG_RD,
+ cpu_serial, 0, "CPU serial number");
+
static int hw_clockrate;
SYSCTL_INT(_hw, OID_AUTO, clockrate, CTLFLAG_RD,
&hw_clockrate, 0, "CPU instruction clock rate");
@@ -695,6 +702,21 @@
(cpu_procinfo & CPUID_HTT_CORES) >> 16 > 1)
printf("\n Hyperthreading: %d logical CPUs",
(cpu_procinfo & CPUID_HTT_CORES) >> 16);
+ /*
+ * Obtain the serial number if the CPU supports it
+ */
+ if (cpu_feature & CPUID_PSN) {
+ do_cpuid(3, regs);
+ snprintf(cpu_serial,
+ sizeof(cpu_serial),
+ "%04x-%04x-%04x-%04x-%04x-%04x",
+ (cpu_id >> 16), (cpu_id & 0xffff),
+ (regs[3] >> 16), (regs[3] & 0xffff),
+ (regs[2] >> 16), (regs[2] & 0xffff));
+ if (bootverbose)
+ printf("\n Processor Serial Number: %s",
+ cpu_serial);
+ }
}
if (strcmp(cpu_vendor, "AuthenticAMD") == 0 &&
cpu_exthigh >= 0x80000001)
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list