a087cb3c40
Rewrite the Intel backend to use the generic PMC interface, which is available on all Intel CPUs. Synchronize the AMD backend with the new interface. The kernel identifies the PMC interface, and gives its id to userland. Userland then queries the events itself (via cpuid etc). These events depend on the PMC interface. The tprof utility is rewritten to allow the user to choose which event to count (which was not possible until now, the event was hardcoded in the backend). The command line format is based on usr.bin/pmc, eg: tprof -e llc-misses:k -o output sleep 20 The man page is updated too, but the arguments will likely change soon anyway so it doesn't matter a lot. The tprof utility has three tables: Intel Architectural Version 1 Intel Skylake/Kabylake AMD Family 10h A CPU can support a combination of tables. For example Kabylake has Intel-Architectural-Version-1 and its own Intel-Kabylake table. For now the Intel Skylake/Kabylake table contains only one event, just to demonstrate that the combination of tables works. Tested on an Intel Core i5 Kabylake. The code for AMD Family 10h is taken from the code I had written for usr.bin/pmc. I haven't tested it yet, but it's the same as pmc(1), so I guess it works as-is. The whole thing is written in such a way that (I think) it is not complicated to add more CPU models, and more architectures (other than x86).
63 lines
2.3 KiB
C
63 lines
2.3 KiB
C
/* $NetBSD: tprof_ioctl.h,v 1.4 2018/07/13 07:56:29 maxv Exp $ */
|
|
|
|
/*-
|
|
* Copyright (c)2008,2010 YAMAMOTO Takashi,
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef _DEV_TPROF_TPROF_IOCTL_H_
|
|
#define _DEV_TPROF_TPROF_IOCTL_H_
|
|
|
|
/*
|
|
* definitions for userland consumer
|
|
*/
|
|
|
|
#include <sys/ioccom.h>
|
|
|
|
#include <dev/tprof/tprof_types.h>
|
|
|
|
#define TPROF_VERSION 4 /* kernel-userland ABI version */
|
|
|
|
struct tprof_info {
|
|
uint32_t ti_version;
|
|
uint32_t ti_ident;
|
|
};
|
|
#define TPROF_IOC_GETINFO _IOR('T', 1, struct tprof_info)
|
|
|
|
#define TPROF_IOC_START _IOW('T', 2, tprof_param_t)
|
|
|
|
#define TPROF_IOC_STOP _IO('T', 3)
|
|
|
|
struct tprof_stat {
|
|
uint64_t ts_sample; /* samples successfully recorded */
|
|
uint64_t ts_overflow; /* samples dropped due to overflow */
|
|
uint64_t ts_buf; /* buffers successfully queued for read(2) */
|
|
uint64_t ts_emptybuf; /* empty buffers dropped */
|
|
uint64_t ts_dropbuf; /* buffers dropped due to the global limit */
|
|
uint64_t ts_dropbuf_sample; /* samples dropped with ts_dropbuf */
|
|
};
|
|
#define TPROF_IOC_GETSTAT _IOR('T', 4, struct tprof_stat)
|
|
|
|
#endif /* _DEV_TPROF_TPROF_IOCTL_H_ */
|