Module Name: src Committed By: maxv Date: Wed Mar 8 16:42:27 UTC 2017
Modified Files: src/sys/arch/i386/i386: pmc.c src/sys/arch/x86/include: sysarch.h src/usr.bin/pmc: pmc.c Log Message: Add a version argument, set to 1, and check it in usr.bin/pmc. Use uint32_t instead uint8_t since we now need 12bit selectors (10h family). And while here KNF. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/sys/arch/i386/i386/pmc.c cvs rdiff -u -r1.9 -r1.10 src/sys/arch/x86/include/sysarch.h cvs rdiff -u -r1.18 -r1.19 src/usr.bin/pmc/pmc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/i386/i386/pmc.c diff -u src/sys/arch/i386/i386/pmc.c:1.23 src/sys/arch/i386/i386/pmc.c:1.24 --- src/sys/arch/i386/i386/pmc.c:1.23 Sat Feb 18 15:56:03 2017 +++ src/sys/arch/i386/i386/pmc.c Wed Mar 8 16:42:27 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: pmc.c,v 1.23 2017/02/18 15:56:03 maxv Exp $ */ +/* $NetBSD: pmc.c,v 1.24 2017/03/08 16:42:27 maxv Exp $ */ /* * Copyright (c) 2017 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmc.c,v 1.23 2017/02/18 15:56:03 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmc.c,v 1.24 2017/03/08 16:42:27 maxv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -275,6 +275,7 @@ sys_pmc_info(struct lwp *l, struct x86_p memset(&rv, 0, sizeof(rv)); + rv.vers = PMC_VERSION; rv.type = pmc_type; rv.flags = pmc_flags; @@ -297,7 +298,7 @@ sys_pmc_startstop(struct lwp *l, struct if (error) return error; - if (args.counter < 0 || args.counter >= pmc_ncounters) + if (args.counter >= pmc_ncounters) return EINVAL; start = (args.flags & (PMC_SETUP_KERNEL|PMC_SETUP_USER)) != 0; @@ -338,7 +339,7 @@ sys_pmc_read(struct lwp *l, struct x86_p if (error) return error; - if (args.counter < 0 || args.counter >= pmc_ncounters) + if (args.counter >= pmc_ncounters) return EINVAL; pmc = &pmc_state[args.counter]; Index: src/sys/arch/x86/include/sysarch.h diff -u src/sys/arch/x86/include/sysarch.h:1.9 src/sys/arch/x86/include/sysarch.h:1.10 --- src/sys/arch/x86/include/sysarch.h:1.9 Wed Jul 7 01:14:53 2010 +++ src/sys/arch/x86/include/sysarch.h Wed Mar 8 16:42:27 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: sysarch.h,v 1.9 2010/07/07 01:14:53 chs Exp $ */ +/* $NetBSD: sysarch.h,v 1.10 2017/03/08 16:42:27 maxv Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -34,62 +34,62 @@ #define X86_GET_LDT 0 #define X86_SET_LDT 1 -#define X86_IOPL 2 -#define X86_GET_IOPERM 3 -#define X86_SET_IOPERM 4 -#define X86_OLD_VM86 5 -#define X86_PMC_INFO 8 -#define X86_PMC_STARTSTOP 9 -#define X86_PMC_READ 10 +#define X86_IOPL 2 +#define X86_GET_IOPERM 3 +#define X86_SET_IOPERM 4 +#define X86_OLD_VM86 5 +#define X86_PMC_INFO 8 +#define X86_PMC_STARTSTOP 9 +#define X86_PMC_READ 10 #define X86_GET_MTRR 11 #define X86_SET_MTRR 12 -#define X86_VM86 13 -#define X86_GET_GSBASE 14 -#define X86_GET_FSBASE 15 -#define X86_SET_GSBASE 16 -#define X86_SET_FSBASE 17 +#define X86_VM86 13 +#define X86_GET_GSBASE 14 +#define X86_GET_FSBASE 15 +#define X86_SET_GSBASE 16 +#define X86_SET_FSBASE 17 #ifdef _KERNEL -#define _X86_SYSARCH_L(x) x86_##x -#define _X86_SYSARCH_U(x) X86_##x +#define _X86_SYSARCH_L(x) x86_##x +#define _X86_SYSARCH_U(x) X86_##x #elif defined(__i386__) -#define _X86_SYSARCH_L(x) i386_##x -#define _X86_SYSARCH_U(x) I386_##x +#define _X86_SYSARCH_L(x) i386_##x +#define _X86_SYSARCH_U(x) I386_##x #define I386_GET_LDT X86_GET_LDT #define I386_SET_LDT X86_SET_LDT -#define I386_IOPL X86_IOPL -#define I386_GET_IOPERM X86_GET_IOPERM -#define I386_SET_IOPERM X86_SET_IOPERM -#define I386_OLD_VM86 X86_OLD_VM86 -#define I386_PMC_INFO X86_PMC_INFO -#define I386_PMC_STARTSTOP X86_PMC_STARTSTOP -#define I386_PMC_READ X86_PMC_READ +#define I386_IOPL X86_IOPL +#define I386_GET_IOPERM X86_GET_IOPERM +#define I386_SET_IOPERM X86_SET_IOPERM +#define I386_OLD_VM86 X86_OLD_VM86 +#define I386_PMC_INFO X86_PMC_INFO +#define I386_PMC_STARTSTOP X86_PMC_STARTSTOP +#define I386_PMC_READ X86_PMC_READ #define I386_GET_MTRR X86_GET_MTRR #define I386_SET_MTRR X86_SET_MTRR -#define I386_VM86 X86_VM86 -#define I386_GET_GSBASE X86_GET_GSBASE -#define I386_GET_FSBASE X86_GET_FSBASE -#define I386_SET_GSBASE X86_SET_GSBASE -#define I386_SET_FSBASE X86_SET_FSBASE +#define I386_VM86 X86_VM86 +#define I386_GET_GSBASE X86_GET_GSBASE +#define I386_GET_FSBASE X86_GET_FSBASE +#define I386_SET_GSBASE X86_SET_GSBASE +#define I386_SET_FSBASE X86_SET_FSBASE #else -#define _X86_SYSARCH_L(x) x86_64_##x -#define _X86_SYSARCH_U(x) X86_64_##x +#define _X86_SYSARCH_L(x) x86_64_##x +#define _X86_SYSARCH_U(x) X86_64_##x #define X86_64_GET_LDT X86_GET_LDT #define X86_64_SET_LDT X86_SET_LDT -#define X86_64_IOPL X86_IOPL -#define X86_64_GET_IOPERM X86_GET_IOPERM -#define X86_64_SET_IOPERM X86_SET_IOPERM -#define X86_64_OLD_VM86 X86_OLD_VM86 -#define X86_64_PMC_INFO X86_PMC_INFO -#define X86_64_PMC_STARTSTOP X86_PMC_STARTSTOP -#define X86_64_PMC_READ X86_PMC_READ +#define X86_64_IOPL X86_IOPL +#define X86_64_GET_IOPERM X86_GET_IOPERM +#define X86_64_SET_IOPERM X86_SET_IOPERM +#define X86_64_OLD_VM86 X86_OLD_VM86 +#define X86_64_PMC_INFO X86_PMC_INFO +#define X86_64_PMC_STARTSTOP X86_PMC_STARTSTOP +#define X86_64_PMC_READ X86_PMC_READ #define X86_64_GET_MTRR X86_GET_MTRR #define X86_64_SET_MTRR X86_SET_MTRR -#define X86_64_VM86 X86_VM86 +#define X86_64_VM86 X86_VM86 #define X86_64_GET_GSBASE X86_GET_GSBASE -#define X86_64_GET_FSBASE X86_GET_FSBASE +#define X86_64_GET_FSBASE X86_GET_FSBASE #define X86_64_SET_GSBASE X86_SET_GSBASE -#define X86_64_SET_FSBASE X86_SET_FSBASE +#define X86_64_SET_FSBASE X86_SET_FSBASE #endif /* @@ -131,30 +131,30 @@ struct _X86_SYSARCH_L(set_ioperm_args) { }; struct _X86_SYSARCH_L(pmc_info_args) { - int type; - int flags; + int vers; + int type; + int flags; }; +#define PMC_VERSION 1 + #define PMC_TYPE_NONE 0 #define PMC_TYPE_I586 1 #define PMC_TYPE_I686 2 #define PMC_TYPE_K7 3 +#define PMC_TYPE_F10H 4 #define PMC_INFO_HASTSC 0x01 -#ifdef __i386__ #define PMC_NCOUNTERS 4 -#else -#define PMC_NCOUNTERS 2 -#endif struct _X86_SYSARCH_L(pmc_startstop_args) { - int counter; + uint32_t counter; uint64_t val; - uint8_t event; - uint8_t unit; - uint8_t compare; - uint8_t flags; + uint32_t event; + uint32_t unit; + uint32_t compare; + uint32_t flags; }; #define PMC_SETUP_KERNEL 0x01 Index: src/usr.bin/pmc/pmc.c diff -u src/usr.bin/pmc/pmc.c:1.18 src/usr.bin/pmc/pmc.c:1.19 --- src/usr.bin/pmc/pmc.c:1.18 Sat Feb 18 16:48:38 2017 +++ src/usr.bin/pmc/pmc.c Wed Mar 8 16:42:27 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: pmc.c,v 1.18 2017/02/18 16:48:38 maxv Exp $ */ +/* $NetBSD: pmc.c,v 1.19 2017/03/08 16:42:27 maxv Exp $ */ /* * Copyright 2000 Wasabi Systems, Inc. @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: pmc.c,v 1.18 2017/02/18 16:48:38 maxv Exp $"); +__RCSID("$NetBSD: pmc.c,v 1.19 2017/03/08 16:42:27 maxv Exp $"); #endif #include <sys/types.h> @@ -426,6 +426,8 @@ main(int argc, char **argv) if (x86_pmc_info(&pmcinfo) < 0) errx(2, "PMC support is not compiled into the kernel"); + if (pmcinfo.vers != 1) + errx(2, "Wrong PMC version"); pncp = pmc_lookup_cpu(pmcinfo.type); if (pncp == NULL)