From owner-svn-src-all@FreeBSD.ORG Fri Jun 20 13:13:39 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id A7107340; Fri, 20 Jun 2014 13:13:39 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 92B6B2042; Fri, 20 Jun 2014 13:13:39 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s5KDDdji006663; Fri, 20 Jun 2014 13:13:39 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s5KDDc0Q006659; Fri, 20 Jun 2014 13:13:38 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201406201313.s5KDDc0Q006659@svn.freebsd.org> From: Konstantin Belousov Date: Fri, 20 Jun 2014 13:13:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r267673 - in head: share/man/man4 sys/dev/cpuctl sys/sys usr.sbin/cpucontrol X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Jun 2014 13:13:39 -0000 Author: kib Date: Fri Jun 20 13:13:38 2014 New Revision: 267673 URL: http://svnweb.freebsd.org/changeset/base/267673 Log: Restore the ABI of the cpuctl(4) ioctl request CPUCTL_CPUID, use separate argument structure with added level_type field for CPUID_CPUID_COUNT request. Reviewed by: attilio (previous version) Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Modified: head/share/man/man4/cpuctl.4 head/sys/dev/cpuctl/cpuctl.c head/sys/sys/cpuctl.h head/usr.sbin/cpucontrol/cpucontrol.c Modified: head/share/man/man4/cpuctl.4 ============================================================================== --- head/share/man/man4/cpuctl.4 Fri Jun 20 11:47:49 2014 (r267672) +++ head/share/man/man4/cpuctl.4 Fri Jun 20 13:13:38 2014 (r267673) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 30, 2009 +.Dd June 20, 2014 .Dt CPUCTL 4 .Os .Sh NAME @@ -65,7 +65,7 @@ All of the supported operations are invo .Xr ioctl 2 system call. Currently, the following ioctls are defined: -.Bl -tag -width CPUCTL_UPDATE +.Bl -tag -width CPUCTL_CPUID_COUNT .It Dv CPUCTL_RDMSR Fa cpuctl_msr_args_t *args .It Dv CPUCTL_WRMSR Fa cpuctl_msr_args_t *args Read/write CPU machine specific register. @@ -86,29 +86,60 @@ Set/clear MSR bits according to the mask .Va data field. .It Dv CPUCTL_CPUID Fa cpuctl_cpuid_args_t *args -.It Dv CPUCTL_CPUID_COUNT Fa cpuctl_cpuid_args_t *args Retrieve CPUID information. -Arguments are supplied in -the following struct: +Arguments are supplied in the following structure: .Bd -literal typedef struct { int level; /* CPUID level */ - int level_type; /* CPUID level type */ uint32_t data[4]; } cpuctl_cpuid_args_t; .Ed -.Pp +It is equivalent to the +.Dv CPUCTL_CPUID_COUNT +request with +.Va level_type +set to 0. +.It Dv CPUCTL_CPUID_COUNT Fa cpuctl_cpuid_count_args_t *args +Retrieve CPUID information. +Arguments are supplied in the following structure: +.Bd -literal +typedef struct { + int level; /* CPUID level */ + int level_type; /* CPUID level type */ + uint32_t data[4]; +} cpuctl_cpuid_count_args_t; +.Ed The .Va level -field indicates the CPUID level to retrieve. +field indicates the CPUID level to retrieve, +it is loaded into the +.Va %eax +register before the CPUID instruction is executed, The .Va level_type -field indicates the CPUID level type to retrieve. -It is overriden to 0 for -.Va CPUCTL_CPUID . -Finally, the +field indicates the CPUID level type to retrieve, +it is loaded into the +.Va %ecx +register. +.Pp +The .Va data field is used to store the received CPUID data. +That is, +.Va data[0] +contains the value of +.Va %eax +register after the CPUID instruction is executed, +.Va data[1] +is for +.Va %ebx , +.Va data[2] +for +.Va %ecx , +and +.Va data[3] +for +.Va %edx . .It Dv CPUCTL_UPDATE cpuctl_update_args_t *args Update CPU firmware (microcode). The structure is defined in Modified: head/sys/dev/cpuctl/cpuctl.c ============================================================================== --- head/sys/dev/cpuctl/cpuctl.c Fri Jun 20 11:47:49 2014 (r267672) +++ head/sys/dev/cpuctl/cpuctl.c Fri Jun 20 13:13:38 2014 (r267673) @@ -69,7 +69,7 @@ static int cpuctl_do_msr(int cpu, cpuctl struct thread *td); static int cpuctl_do_cpuid(int cpu, cpuctl_cpuid_args_t *data, struct thread *td); -static int cpuctl_do_cpuid_count(int cpu, cpuctl_cpuid_args_t *data, +static int cpuctl_do_cpuid_count(int cpu, cpuctl_cpuid_count_args_t *data, struct thread *td); static int cpuctl_do_update(int cpu, cpuctl_update_args_t *data, struct thread *td); @@ -180,8 +180,8 @@ cpuctl_ioctl(struct cdev *dev, u_long cm ret = cpuctl_do_update(cpu, (cpuctl_update_args_t *)data, td); break; case CPUCTL_CPUID_COUNT: - ret = cpuctl_do_cpuid_count(cpu, (cpuctl_cpuid_args_t *)data, - td); + ret = cpuctl_do_cpuid_count(cpu, + (cpuctl_cpuid_count_args_t *)data, td); break; default: ret = EINVAL; @@ -195,7 +195,8 @@ fail: * Actually perform cpuid operation. */ static int -cpuctl_do_cpuid_count(int cpu, cpuctl_cpuid_args_t *data, struct thread *td) +cpuctl_do_cpuid_count(int cpu, cpuctl_cpuid_count_args_t *data, + struct thread *td) { int is_bound = 0; int oldcpu; @@ -218,10 +219,15 @@ cpuctl_do_cpuid_count(int cpu, cpuctl_cp static int cpuctl_do_cpuid(int cpu, cpuctl_cpuid_args_t *data, struct thread *td) { + cpuctl_cpuid_count_args_t cdata; + int error; + cdata.level = data->level; /* Override the level type. */ - data->level_type = 0; - return (cpuctl_do_cpuid_count(cpu, data, td)); + cdata.level_type = 0; + error = cpuctl_do_cpuid_count(cpu, &cdata, td); + bcopy(cdata.data, data->data, sizeof(data->data)); /* Ignore error */ + return (error); } /* Modified: head/sys/sys/cpuctl.h ============================================================================== --- head/sys/sys/cpuctl.h Fri Jun 20 11:47:49 2014 (r267672) +++ head/sys/sys/cpuctl.h Fri Jun 20 13:13:38 2014 (r267673) @@ -36,11 +36,16 @@ typedef struct { typedef struct { int level; /* CPUID level */ - int level_type; /* CPUID level type */ uint32_t data[4]; } cpuctl_cpuid_args_t; typedef struct { + int level; /* CPUID level */ + int level_type; /* CPUID level type */ + uint32_t data[4]; +} cpuctl_cpuid_count_args_t; + +typedef struct { void *data; size_t size; } cpuctl_update_args_t; @@ -51,6 +56,6 @@ typedef struct { #define CPUCTL_UPDATE _IOWR('c', 4, cpuctl_update_args_t) #define CPUCTL_MSRSBIT _IOWR('c', 5, cpuctl_msr_args_t) #define CPUCTL_MSRCBIT _IOWR('c', 6, cpuctl_msr_args_t) -#define CPUCTL_CPUID_COUNT _IOWR('c', 7, cpuctl_cpuid_args_t) +#define CPUCTL_CPUID_COUNT _IOWR('c', 7, cpuctl_cpuid_count_args_t) #endif /* _CPUCTL_H_ */ Modified: head/usr.sbin/cpucontrol/cpucontrol.c ============================================================================== --- head/usr.sbin/cpucontrol/cpucontrol.c Fri Jun 20 11:47:49 2014 (r267672) +++ head/usr.sbin/cpucontrol/cpucontrol.c Fri Jun 20 13:13:38 2014 (r267673) @@ -175,7 +175,7 @@ do_cpuid_count(const char *cmdarg, const { char *cmdarg1, *endptr, *endptr1; unsigned int level, level_type; - cpuctl_cpuid_args_t args; + cpuctl_cpuid_count_args_t args; int fd, error; assert(cmdarg != NULL);