From owner-freebsd-mips@FreeBSD.ORG Mon Apr 23 07:47:41 2012 Return-Path: Delivered-To: freebsd-mips@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 02257106566B; Mon, 23 Apr 2012 07:47:41 +0000 (UTC) (envelope-from fabien.thomas@netasq.com) Received: from work.netasq.com (gwlille.netasq.com [91.212.116.1]) by mx1.freebsd.org (Postfix) with ESMTP id 02E6C8FC12; Mon, 23 Apr 2012 07:47:39 +0000 (UTC) Received: from [10.2.1.1] (unknown [10.2.1.1]) by work.netasq.com (Postfix) with ESMTPSA id B1F0527030D4; Mon, 23 Apr 2012 09:48:11 +0200 (CEST) Mime-Version: 1.0 (Apple Message framework v1257) Content-Type: multipart/signed; boundary="Apple-Mail=_24EA901A-324C-4465-880C-9C948861B2D8"; protocol="application/pkcs7-signature"; micalg=sha1 From: Fabien Thomas In-Reply-To: Date: Mon, 23 Apr 2012 09:47:45 +0200 Message-Id: <25D59FAA-D52A-42FB-8120-66467863AB0B@netasq.com> References: <201203282058.q2SKwVsJ053900@svn.freebsd.org> To: Monthadar Al Jaberi X-Mailer: Apple Mail (2.1257) X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Cc: monthadar@freebsd.org, freebsd-current , Fabien Thomas , freebsd-mips@freebsd.org Subject: Re: svn commit: r233628 - in head: lib/libpmc sys/amd64/amd64 sys/amd64/include sys/arm/include sys/conf sys/dev/hwpmc sys/i386/i386 sys/i386/include sys/kern sys/mips/include sys/modules/hwpmc sys/pow... X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Apr 2012 07:47:41 -0000 --Apple-Mail=_24EA901A-324C-4465-880C-9C948861B2D8 Content-Type: multipart/mixed; boundary="Apple-Mail=_0FFE1445-1962-4A52-A902-4106C0401133" --Apple-Mail=_0FFE1445-1962-4A52-A902-4106C0401133 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii Hi, The rumors seems true :) Can you try the patch attached (I cannot test as i've no MIPS hardware) ? Thanks, Fabien --Apple-Mail=_0FFE1445-1962-4A52-A902-4106C0401133 Content-Disposition: attachment; filename=patch-fixsoft Content-Type: application/octet-stream; name="patch-fixsoft" Content-Transfer-Encoding: 7bit Index: dev/hwpmc/hwpmc_mips.c =================================================================== --- dev/hwpmc/hwpmc_mips.c (revision 233824) +++ dev/hwpmc/hwpmc_mips.c (working copy) @@ -431,11 +431,9 @@ M_WAITOK|M_ZERO); /* Just one class */ - pmc_mdep = malloc(sizeof(struct pmc_mdep) + sizeof(struct pmc_classdep), - M_PMC, M_WAITOK|M_ZERO); + pmc_mdep = pmc_mdep_alloc(1); pmc_mdep->pmd_cputype = mips_pmc_spec.ps_cputype; - pmc_mdep->pmd_nclass = 1; pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_MIPS]; pcd->pcd_caps = mips_pmc_spec.ps_capabilities; Index: dev/hwpmc/hwpmc_powerpc.c =================================================================== --- dev/hwpmc/hwpmc_powerpc.c (revision 233824) +++ dev/hwpmc/hwpmc_powerpc.c (working copy) @@ -803,11 +803,9 @@ M_WAITOK|M_ZERO); /* Just one class */ - pmc_mdep = malloc(sizeof(struct pmc_mdep) + sizeof(struct pmc_classdep), - M_PMC, M_WAITOK|M_ZERO); + pmc_mdep = pmc_mdep_alloc(1); pmc_mdep->pmd_cputype = PMC_CPU_PPC_7450; - pmc_mdep->pmd_nclass = 1; pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_PPC7450]; pcd->pcd_caps = POWERPC_PMC_CAPS; --Apple-Mail=_0FFE1445-1962-4A52-A902-4106C0401133 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Mon, Apr 23, 2012 at 8:44 AM, Adrian Chadd = wrote: >> Hi Fabien, >>=20 >> I've heard some rumours that this broke hwpmc support for mips24k. >>=20 >> Monthadar, can you please provide some background info for this? >>=20 >=20 > This is the log output >=20 > Using default protocol (TFTP) > Entry point: 0x80050100, address range: 0x80050000-0x804f1dcc > RedBoot> exec > Now booting linux kernel: > Base address 0x80050000 Entry 0x80050100 > memsize=3D0x08000000 > modetty0=3D0,n,8,1,hw > board=3DRouterStation PRO > ethaddr=3D00.15.6d.c8.c9.2e > CPU platform: Atheros AR7161 rev 2 > CPU Frequency=3D720 MHz > CPU DDR Frequency=3D360 MHz > CPU AHB Frequency=3D180 MHz > platform frequency: 720000000 > arguments: > a0 =3D 00000002 > a1 =3D 80050028 > a2 =3D 80050000 > a3 =3D 00000001 > Cmd line: = =EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BDm=EF=BF=BD=EF= =BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF= =BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD_}=EF=BF=BD=EF=BF=BD=EF=BF= =BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=DF=BEq=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF= =BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF= =BD=EF=BF=BD=EF=BF=BD=7F=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF= =BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD= =EF=BF=BD=EF=BF=BD=EF=BF=BD=DF=BF=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF= =BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD_=EF=BF=BDw=EF=BF=BD=EF=BF=BD=EF=BF= =BD=EF=BF=BD=1F=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD?-=EF=BF=BD=EF= =BF=BD=EF=BF=BD=EF=BF=BD{=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF= =BD~=EF=BF=BD=EF=BF=BD > Environment: > memsize =3D 0x08000000 > modetty0 =3D 0,n,8,1,hw > ethaddr =3D 00.15.6d.c8.c9.2e > board =3D RouterStation PRO > Cache info: > picache_stride =3D 4096 > picache_loopcount =3D 16 > pdcache_stride =3D 4096 > pdcache_loopcount =3D 8 > cpu0: MIPS Technologies processor v116.147 > MMU: Standard TLB, 16 entries > L1 i-cache: 4 ways of 512 sets, 32 bytes per line > L1 d-cache: 4 ways of 256 sets, 32 bytes per line > Config1=3D0x9ee3519e > Config3=3D0x20 > KDB: debugger backends: ddb > KDB: current backend: ddb > Copyright (c) 1992-2012 The FreeBSD Project. > Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, = 1994 > The Regents of the University of California. All rights = reserved. > FreeBSD is a registered trademark of The FreeBSD Foundation. > FreeBSD 10.0-CURRENT #12: Fri Apr 20 18:03:16 CEST 2012 > root@freebsd-re-9:/usr/obj/mips.mips/usr/src/sys/RSPRO_USB_PROD = mips > WARNING: WITNESS option enabled, expect reduced performance. > MEMGUARD DEBUGGING ALLOCATOR INITIALIZED: > MEMGUARD map base: 0xc0800000 > MEMGUARD map limit: 0xc1c00000 > MEMGUARD map size: 20480 KBytes > real memory =3D 134217728 (131072K bytes) > avail memory =3D 123117568 (117MB) > random device not loaded; using insecure entropy > nexus0: > clock0: on nexus0 > Timecounter "MIPS32" frequency 360000000 Hz quality 800 > Event timer "MIPS32" frequency 360000000 Hz quality 800 > apb0 at irq 4 on nexus0 > uart0: <16550 or compatible> on apb0 > uart0: console (115200,n,8,1) > gpio0: on apb0 > gpio0: [GIANT-LOCKED] > gpio0: gpio pinmask=3D0x0 > gpioc0: on gpio0 > gpiobus0: on gpio0 > ehci0: at mem > 0x1b000000-0x1bffffff irq 1 on nexus0 > usbus0: set host controller mode > usbus0: EHCI version 1.0 > usbus0: set host controller mode > usbus0 on ehci0 > pcib0 at irq 0 on nexus0 > pci0: on pcib0 > pci0: at device 0.0 (no driver attached) > ath0: irq 0 at device 17.0 on pci0 > ath0: AR5413 mac 10.5 RF5413 phy 6.1 > ath0: 2GHz radio: 0x0000; 5GHz radio: 0x0063 > arge0: at mem > 0x19000000-0x19000fff irq 2 on nexus0 > arge0: No PHY specified, using mask 16 > miibus0: on arge0 > ukphy0: PHY 4 on miibus0 > ukphy0: none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, > 1000baseT-FDX, 1000baseT-FDX-master, auto > arge0: Ethernet address: 00:15:6d:c8:c9:2e > arge1: at mem > 0x1a000000-0x1a000fff irq 3 on nexus0 > arge1: No PHY specified, using mask 15 > arge1: Ethernet address: 00:15:6d:c8:c9:2f > spi0: at mem 0x1f000000-0x1f00000f on nexus0 > spibus0: on spi0 > mx25l0: at cs 0 on spibus0 > mx25l0: mx25ll128, sector 65536 bytes, 256 sectors > ar71xx_wdog0: on nexus0 > Timecounters tick every 1.000 msec > usbus0: 480Mbps High Speed USB v2.0 > ugen0.1: at usbus0 > uhub0: on = usbus0 > panic: [pmc,4816] npmc miscomputed: ri=3D0, md->npmc=3D2 > KDB: enter: panic > [ thread pid 0 tid 100000 ] > Stopped at kdb_enter+0x4c: lui at,0x8050 > db> tr > Tracing pid 0 tid 100000 td 0x804f76d0 > db_trace_thread+30 (?,?,?,?) ra 8068b94800000018 sp 0 sz 0 > 80075adc+114 (0,?,ffffffff,?) ra 8068b96000000020 sp 100000000 sz 1 > 80074e24+388 (?,?,?,?) ra 8068b980000000a8 sp 0 sz 0 > db_command_loop+70 (?,?,?,?) ra 8068ba2800000018 sp 0 sz 0 > 80077900+f4 (?,?,?,?) ra 8068ba40000001a8 sp 0 sz 0 > kdb_trap+110 (?,?,?,?) ra 8068bbe800000030 sp 0 sz 0 > trap+c7c (?,?,?,?) ra 8068bc18000000b8 sp 0 sz 0 > MipsKernGenException+134 (0,4,8043b1d4,119) ra 8068bcd0000000c8 sp > 100000001 sz 1 > kdb_enter+4c (?,?,?,?) ra 8068bd9800000018 sp 0 sz 0 > panic+11c (?,12d0,0,2) ra 8068bdb000000028 sp 1 sz 1 > 800e8ca8+274 (?,?,?,?) ra 8068bdd800000038 sp 0 sz 0 > syscall_module_handler+b8 (?,?,?,?) ra 8068be1000000028 sp 0 sz 0 > module_register_init+9c (?,?,?,?) ra 8068be3800000028 sp 0 sz 0 > mi_startup+138 (?,?,?,?) ra 8068be6000000020 sp 0 sz 0 > _start+90 (?,?,?,?) ra 8068be8000000000 sp 0 sz 0 > pid 0 > db> >=20 >> Thanks, >>=20 >>=20 >>=20 >> adrian >>=20 >> On 28 March 2012 13:58, Fabien Thomas wrote: >>> Author: fabient >>> Date: Wed Mar 28 20:58:30 2012 >>> New Revision: 233628 >>> URL: http://svn.freebsd.org/changeset/base/233628 >>>=20 >>> Log: >>> Add software PMC support. >>>=20 >>> New kernel events can be added at various location for sampling or = counting. >>> This will for example allow easy system profiling whatever the = processor is >>> with known tools like pmcstat(8). >>>=20 >>> Simultaneous usage of software PMC and hardware PMC is possible, = for example >>> looking at the lock acquire failure, page fault while sampling on >>> instructions. >>>=20 >>> Sponsored by: NETASQ >>> MFC after: 1 month >>>=20 >>> Added: >>> head/lib/libpmc/pmc.soft.3 (contents, props changed) >>> head/sys/dev/hwpmc/hwpmc_soft.c (contents, props changed) >>> head/sys/dev/hwpmc/hwpmc_soft.h (contents, props changed) >>> Modified: >>> head/lib/libpmc/Makefile >>> head/lib/libpmc/libpmc.c >>> head/lib/libpmc/pmc.3 >>> head/lib/libpmc/pmc.atom.3 >>> head/lib/libpmc/pmc.core.3 >>> head/lib/libpmc/pmc.core2.3 >>> head/lib/libpmc/pmc.corei7.3 >>> head/lib/libpmc/pmc.corei7uc.3 >>> head/lib/libpmc/pmc.iaf.3 >>> head/lib/libpmc/pmc.k7.3 >>> head/lib/libpmc/pmc.k8.3 >>> head/lib/libpmc/pmc.mips24k.3 >>> head/lib/libpmc/pmc.octeon.3 >>> head/lib/libpmc/pmc.p4.3 >>> head/lib/libpmc/pmc.p5.3 >>> head/lib/libpmc/pmc.p6.3 >>> head/lib/libpmc/pmc.sandybridge.3 >>> head/lib/libpmc/pmc.sandybridgeuc.3 >>> head/lib/libpmc/pmc.tsc.3 >>> head/lib/libpmc/pmc.ucf.3 >>> head/lib/libpmc/pmc.westmere.3 >>> head/lib/libpmc/pmc.westmereuc.3 >>> head/lib/libpmc/pmc.xscale.3 >>> head/lib/libpmc/pmclog.c >>> head/lib/libpmc/pmclog.h >>> head/sys/amd64/amd64/trap.c >>> head/sys/amd64/include/pmc_mdep.h >>> head/sys/arm/include/pmc_mdep.h >>> head/sys/conf/files >>> head/sys/dev/hwpmc/hwpmc_amd.c >>> head/sys/dev/hwpmc/hwpmc_core.c >>> head/sys/dev/hwpmc/hwpmc_intel.c >>> head/sys/dev/hwpmc/hwpmc_logging.c >>> head/sys/dev/hwpmc/hwpmc_mips.c >>> head/sys/dev/hwpmc/hwpmc_mod.c >>> head/sys/dev/hwpmc/hwpmc_piv.c >>> head/sys/dev/hwpmc/hwpmc_powerpc.c >>> head/sys/dev/hwpmc/hwpmc_ppro.c >>> head/sys/dev/hwpmc/hwpmc_tsc.c >>> head/sys/dev/hwpmc/hwpmc_x86.c >>> head/sys/dev/hwpmc/hwpmc_xscale.c >>> head/sys/dev/hwpmc/pmc_events.h >>> head/sys/i386/i386/trap.c >>> head/sys/i386/include/pmc_mdep.h >>> head/sys/kern/kern_clock.c >>> head/sys/kern/kern_lock.c >>> head/sys/kern/kern_mutex.c >>> head/sys/kern/kern_pmc.c >>> head/sys/kern/kern_rwlock.c >>> head/sys/kern/kern_sx.c >>> head/sys/kern/subr_trap.c >>> head/sys/mips/include/pmc_mdep.h >>> head/sys/modules/hwpmc/Makefile >>> head/sys/powerpc/include/pmc_mdep.h >>> head/sys/sys/pmc.h >>> head/sys/sys/pmckern.h >>> head/sys/sys/pmclog.h >>> head/usr.sbin/pmcstat/pmcstat_log.c >>>=20 >>> Modified: head/lib/libpmc/Makefile >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/Makefile Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/Makefile Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -20,6 +20,7 @@ MAN+=3D pmc_read.3 >>> MAN+=3D pmc_set.3 >>> MAN+=3D pmc_start.3 >>> MAN+=3D pmclog.3 >>> +MAN+=3D pmc.soft.3 >>>=20 >>> # PMC-dependent manual pages >>> .if ${MACHINE_CPUARCH} =3D=3D "i386" || ${MACHINE_CPUARCH} =3D=3D = "amd64" >>>=20 >>> Modified: head/lib/libpmc/libpmc.c >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/libpmc.c Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/libpmc.c Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -77,11 +77,12 @@ static int tsc_allocate_pmc(enum pmc_eve >>> static int xscale_allocate_pmc(enum pmc_event _pe, char *_ctrspec, >>> struct pmc_op_pmcallocate *_pmc_config); >>> #endif >>> - >>> #if defined(__mips__) >>> static int mips_allocate_pmc(enum pmc_event _pe, char* ctrspec, >>> struct pmc_op_pmcallocate *_pmc_config); >>> #endif /* __mips__ */ >>> +static int soft_allocate_pmc(enum pmc_event _pe, char *_ctrspec, >>> + struct pmc_op_pmcallocate *_pmc_config); >>>=20 >>> #if defined(__powerpc__) >>> static int ppc7450_allocate_pmc(enum pmc_event _pe, char* ctrspec, >>> @@ -156,6 +157,8 @@ PMC_CLASSDEP_TABLE(octeon, OCTEON); >>> PMC_CLASSDEP_TABLE(ucf, UCF); >>> PMC_CLASSDEP_TABLE(ppc7450, PPC7450); >>>=20 >>> +static struct pmc_event_descr soft_event_table[PMC_EV_DYN_COUNT]; >>> + >>> #undef __PMC_EV_ALIAS >>> #define __PMC_EV_ALIAS(N,CODE) { N, PMC_EV_##CODE }, >>>=20 >>> @@ -215,21 +218,22 @@ static const struct pmc_event_descr west >>> PMC_CLASS_##C, __VA_ARGS__ \ >>> } >>>=20 >>> -PMC_MDEP_TABLE(atom, IAP, PMC_CLASS_IAF, PMC_CLASS_TSC); >>> -PMC_MDEP_TABLE(core, IAP, PMC_CLASS_TSC); >>> -PMC_MDEP_TABLE(core2, IAP, PMC_CLASS_IAF, PMC_CLASS_TSC); >>> -PMC_MDEP_TABLE(corei7, IAP, PMC_CLASS_IAF, PMC_CLASS_TSC, = PMC_CLASS_UCF, PMC_CLASS_UCP); >>> -PMC_MDEP_TABLE(sandybridge, IAP, PMC_CLASS_IAF, PMC_CLASS_TSC, = PMC_CLASS_UCF, PMC_CLASS_UCP); >>> -PMC_MDEP_TABLE(westmere, IAP, PMC_CLASS_IAF, PMC_CLASS_TSC, = PMC_CLASS_UCF, PMC_CLASS_UCP); >>> -PMC_MDEP_TABLE(k7, K7, PMC_CLASS_TSC); >>> -PMC_MDEP_TABLE(k8, K8, PMC_CLASS_TSC); >>> -PMC_MDEP_TABLE(p4, P4, PMC_CLASS_TSC); >>> -PMC_MDEP_TABLE(p5, P5, PMC_CLASS_TSC); >>> -PMC_MDEP_TABLE(p6, P6, PMC_CLASS_TSC); >>> -PMC_MDEP_TABLE(xscale, XSCALE, PMC_CLASS_XSCALE); >>> -PMC_MDEP_TABLE(mips24k, MIPS24K, PMC_CLASS_MIPS24K); >>> -PMC_MDEP_TABLE(octeon, OCTEON, PMC_CLASS_OCTEON); >>> -PMC_MDEP_TABLE(ppc7450, PPC7450, PMC_CLASS_PPC7450); >>> +PMC_MDEP_TABLE(atom, IAP, PMC_CLASS_SOFT, PMC_CLASS_IAF, = PMC_CLASS_TSC); >>> +PMC_MDEP_TABLE(core, IAP, PMC_CLASS_SOFT, PMC_CLASS_TSC); >>> +PMC_MDEP_TABLE(core2, IAP, PMC_CLASS_SOFT, PMC_CLASS_IAF, = PMC_CLASS_TSC); >>> +PMC_MDEP_TABLE(corei7, IAP, PMC_CLASS_SOFT, PMC_CLASS_IAF, = PMC_CLASS_TSC, PMC_CLASS_UCF, PMC_CLASS_UCP); >>> +PMC_MDEP_TABLE(sandybridge, IAP, PMC_CLASS_SOFT, PMC_CLASS_IAF, = PMC_CLASS_TSC, PMC_CLASS_UCF, PMC_CLASS_UCP); >>> +PMC_MDEP_TABLE(westmere, IAP, PMC_CLASS_SOFT, PMC_CLASS_IAF, = PMC_CLASS_TSC, PMC_CLASS_UCF, PMC_CLASS_UCP); >>> +PMC_MDEP_TABLE(k7, K7, PMC_CLASS_SOFT, PMC_CLASS_TSC); >>> +PMC_MDEP_TABLE(k8, K8, PMC_CLASS_SOFT, PMC_CLASS_TSC); >>> +PMC_MDEP_TABLE(p4, P4, PMC_CLASS_SOFT, PMC_CLASS_TSC); >>> +PMC_MDEP_TABLE(p5, P5, PMC_CLASS_SOFT, PMC_CLASS_TSC); >>> +PMC_MDEP_TABLE(p6, P6, PMC_CLASS_SOFT, PMC_CLASS_TSC); >>> +PMC_MDEP_TABLE(xscale, XSCALE, PMC_CLASS_SOFT, PMC_CLASS_XSCALE); >>> +PMC_MDEP_TABLE(mips24k, MIPS24K, PMC_CLASS_SOFT, = PMC_CLASS_MIPS24K); >>> +PMC_MDEP_TABLE(octeon, OCTEON, PMC_CLASS_SOFT, PMC_CLASS_OCTEON); >>> +PMC_MDEP_TABLE(ppc7450, PPC7450, PMC_CLASS_SOFT, = PMC_CLASS_PPC7450); >>> +PMC_MDEP_TABLE(generic, SOFT, PMC_CLASS_SOFT); >>>=20 >>> static const struct pmc_event_descr tsc_event_table[] =3D >>> { >>> @@ -279,16 +283,24 @@ PMC_CLASS_TABLE_DESC(tsc, TSC, tsc, tsc) >>> #if defined(__XSCALE__) >>> PMC_CLASS_TABLE_DESC(xscale, XSCALE, xscale, xscale); >>> #endif >>> - >>> #if defined(__mips__) >>> PMC_CLASS_TABLE_DESC(mips24k, MIPS24K, mips24k, mips); >>> PMC_CLASS_TABLE_DESC(octeon, OCTEON, octeon, mips); >>> #endif /* __mips__ */ >>> - >>> #if defined(__powerpc__) >>> PMC_CLASS_TABLE_DESC(ppc7450, PPC7450, ppc7450, ppc7450); >>> #endif >>>=20 >>> +static struct pmc_class_descr soft_class_table_descr =3D >>> +{ >>> + .pm_evc_name =3D "SOFT-", >>> + .pm_evc_name_size =3D sizeof("SOFT-") - 1, >>> + .pm_evc_class =3D PMC_CLASS_SOFT, >>> + .pm_evc_event_table =3D NULL, >>> + .pm_evc_event_table_size =3D 0, >>> + .pm_evc_allocate_pmc =3D soft_allocate_pmc >>> +}; >>> + >>> #undef PMC_CLASS_TABLE_DESC >>>=20 >>> static const struct pmc_class_descr **pmc_class_table; >>> @@ -343,9 +355,12 @@ static const char * pmc_state_names[] =3D >>> __PMC_STATES() >>> }; >>>=20 >>> -static int pmc_syscall =3D -1; /* filled in by pmc_init() = */ >>> - >>> -static struct pmc_cpuinfo cpu_info; /* filled in by pmc_init() = */ >>> +/* >>> + * Filled in by pmc_init(). >>> + */ >>> +static int pmc_syscall =3D -1; >>> +static struct pmc_cpuinfo cpu_info; >>> +static struct pmc_op_getdyneventinfo soft_event_info; >>>=20 >>> /* Event masks for events */ >>> struct pmc_masks { >>> @@ -2179,6 +2194,25 @@ tsc_allocate_pmc(enum pmc_event pe, char >>> } >>> #endif >>>=20 >>> +static struct pmc_event_alias generic_aliases[] =3D { >>> + EV_ALIAS("instructions", "SOFT-CLOCK.HARD"), >>> + EV_ALIAS(NULL, NULL) >>> +}; >>> + >>> +static int >>> +soft_allocate_pmc(enum pmc_event pe, char *ctrspec, >>> + struct pmc_op_pmcallocate *pmc_config) >>> +{ >>> + (void)ctrspec; >>> + (void)pmc_config; >>> + >>> + if (pe < PMC_EV_SOFT_FIRST || pe > PMC_EV_SOFT_LAST) >>> + return (-1); >>> + >>> + pmc_config->pm_caps |=3D (PMC_CAP_READ | PMC_CAP_WRITE); >>> + return (0); >>> +} >>> + >>> #if defined(__XSCALE__) >>>=20 >>> static struct pmc_event_alias xscale_aliases[] =3D { >>> @@ -2663,6 +2697,10 @@ pmc_event_names_of_class(enum pmc_class >>> ev =3D ppc7450_event_table; >>> count =3D PMC_EVENT_TABLE_SIZE(ppc7450); >>> break; >>> + case PMC_CLASS_SOFT: >>> + ev =3D soft_event_table; >>> + count =3D soft_event_info.pm_nevent; >>> + break; >>> default: >>> errno =3D EINVAL; >>> return (-1); >>> @@ -2676,6 +2714,7 @@ pmc_event_names_of_class(enum pmc_class >>>=20 >>> for (;count--; ev++, names++) >>> *names =3D ev->pm_ev_name; >>> + >>> return (0); >>> } >>>=20 >>> @@ -2780,11 +2819,34 @@ pmc_init(void) >>> pmc_class_table[n] =3D NULL; >>>=20 >>> /* >>> + * Get soft events list. >>> + */ >>> + soft_event_info.pm_class =3D PMC_CLASS_SOFT; >>> + if (PMC_CALL(GETDYNEVENTINFO, &soft_event_info) < 0) >>> + return (pmc_syscall =3D -1); >>> + >>> + /* Map soft events to static list. */ >>> + for (n =3D 0; n < soft_event_info.pm_nevent; n++) { >>> + soft_event_table[n].pm_ev_name =3D >>> + soft_event_info.pm_events[n].pm_ev_name; >>> + soft_event_table[n].pm_ev_code =3D >>> + soft_event_info.pm_events[n].pm_ev_code; >>> + } >>> + soft_class_table_descr.pm_evc_event_table_size =3D \ >>> + soft_event_info.pm_nevent; >>> + soft_class_table_descr.pm_evc_event_table =3D \ >>> + soft_event_table; >>> + >>> + /* >>> * Fill in the class table. >>> */ >>> n =3D 0; >>> + >>> + /* Fill soft events information. */ >>> + pmc_class_table[n++] =3D &soft_class_table_descr; >>> #if defined(__amd64__) || defined(__i386__) >>> - pmc_class_table[n++] =3D &tsc_class_table_descr; >>> + if (cpu_info.pm_cputype !=3D PMC_CPU_GENERIC) >>> + pmc_class_table[n++] =3D &tsc_class_table_descr; >>>=20 >>> /* >>> * Check if this CPU has fixed function counters. >>> @@ -2867,6 +2929,9 @@ pmc_init(void) >>> pmc_class_table[n] =3D &p4_class_table_descr; >>> break; >>> #endif >>> + case PMC_CPU_GENERIC: >>> + PMC_MDEP_INIT(generic); >>> + break; >>> #if defined(__XSCALE__) >>> case PMC_CPU_INTEL_XSCALE: >>> PMC_MDEP_INIT(xscale); >>> @@ -3035,18 +3100,19 @@ _pmc_name_of_event(enum pmc_event pe, en >>> evfence =3D xscale_event_table + = PMC_EVENT_TABLE_SIZE(xscale); >>> } else if (pe >=3D PMC_EV_MIPS24K_FIRST && pe <=3D = PMC_EV_MIPS24K_LAST) { >>> ev =3D mips24k_event_table; >>> - evfence =3D mips24k_event_table + = PMC_EVENT_TABLE_SIZE(mips24k >>> -); >>> + evfence =3D mips24k_event_table + = PMC_EVENT_TABLE_SIZE(mips24k); >>> } else if (pe >=3D PMC_EV_OCTEON_FIRST && pe <=3D = PMC_EV_OCTEON_LAST) { >>> ev =3D octeon_event_table; >>> evfence =3D octeon_event_table + = PMC_EVENT_TABLE_SIZE(octeon); >>> } else if (pe >=3D PMC_EV_PPC7450_FIRST && pe <=3D = PMC_EV_PPC7450_LAST) { >>> ev =3D ppc7450_event_table; >>> - evfence =3D ppc7450_event_table + = PMC_EVENT_TABLE_SIZE(ppc7450 >>> -); >>> + evfence =3D ppc7450_event_table + = PMC_EVENT_TABLE_SIZE(ppc7450); >>> } else if (pe =3D=3D PMC_EV_TSC_TSC) { >>> ev =3D tsc_event_table; >>> evfence =3D tsc_event_table + = PMC_EVENT_TABLE_SIZE(tsc); >>> + } else if (pe >=3D PMC_EV_SOFT_FIRST && pe <=3D = PMC_EV_SOFT_LAST) { >>> + ev =3D soft_event_table; >>> + evfence =3D soft_event_table + = soft_event_info.pm_nevent; >>> } >>>=20 >>> for (; ev !=3D evfence; ev++) >>>=20 >>> Modified: head/lib/libpmc/pmc.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -223,6 +223,8 @@ and >>> CPUs. >>> .It Li PMC_CLASS_TSC >>> The timestamp counter on i386 and amd64 architecture CPUs. >>> +.It Li PMC_CLASS_SOFT >>> +Software events. >>> .El >>> .Ss PMC Capabilities >>> Capabilities of performance monitoring hardware are denoted using >>> @@ -525,6 +527,7 @@ API is >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmclog 3 , >>> .Xr hwpmc 4 , >>>=20 >>> Modified: head/lib/libpmc/pmc.atom.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.atom.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.atom.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -1176,6 +1176,7 @@ and the underlying hardware events used >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.core.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.core.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.core.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -792,6 +792,7 @@ may not count some transitions. >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmclog 3 , >>> .Xr hwpmc 4 >>>=20 >>> Modified: head/lib/libpmc/pmc.core2.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.core2.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.core2.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -1107,6 +1107,7 @@ and the underlying hardware events used. >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.corei7.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.corei7.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.corei7.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -1559,6 +1559,7 @@ Counts number of segment register loads. >>> .Xr pmc.corei7uc 3 , >>> .Xr pmc.westmere 3 , >>> .Xr pmc.westmereuc 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.corei7uc.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.corei7uc.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.corei7uc.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -863,6 +863,7 @@ refreshed or needs to go into a power do >>> .Xr pmc.corei7 3 , >>> .Xr pmc.westmere 3 , >>> .Xr pmc.westmereuc 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.iaf.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.iaf.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.iaf.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -132,6 +132,7 @@ CPU, use the event specifier >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.k7.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.k7.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.k7.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -249,6 +249,7 @@ and the underlying hardware events used. >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmclog 3 , >>> .Xr hwpmc 4 >>>=20 >>> Modified: head/lib/libpmc/pmc.k8.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.k8.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.k8.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -783,6 +783,7 @@ and the underlying hardware events used. >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmclog 3 , >>> .Xr hwpmc 4 >>>=20 >>> Modified: head/lib/libpmc/pmc.mips24k.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.mips24k.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.mips24k.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -392,6 +392,7 @@ and the underlying hardware events used. >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.octeon.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.octeon.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.octeon.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -232,6 +232,7 @@ and the underlying hardware events used. >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.p4.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.p4.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.p4.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -1208,6 +1208,7 @@ and the underlying hardware events used. >>> .Xr pmc.k8 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmclog 3 , >>> .Xr hwpmc 4 >>>=20 >>> Modified: head/lib/libpmc/pmc.p5.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.p5.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.p5.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -444,6 +444,7 @@ and the underlying hardware events used. >>> .Xr pmc.k8 3 , >>> .Xr pmc.p4 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmclog 3 , >>> .Xr hwpmc 4 >>>=20 >>> Modified: head/lib/libpmc/pmc.p6.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.p6.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.p6.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -1010,6 +1010,7 @@ and the underlying hardware events used. >>> .Xr pmc.k8 3 , >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmclog 3 , >>> .Xr hwpmc 4 >>>=20 >>> Modified: head/lib/libpmc/pmc.sandybridge.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.sandybridge.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.sandybridge.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -907,6 +907,7 @@ Split locks in SQ. >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> .Xr pmc.sandybridgeuc 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc.ucf 3 , >>> .Xr pmc.westmere 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.sandybridgeuc.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.sandybridgeuc.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.sandybridgeuc.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -208,6 +208,7 @@ Counts the number of core-outgoing entri >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> .Xr pmc.sandybridge 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc.ucf 3 , >>> .Xr pmc.westmere 3 , >>>=20 >>> Added: head/lib/libpmc/pmc.soft.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- /dev/null 00:00:00 1970 (empty, because file is newly added) >>> +++ head/lib/libpmc/pmc.soft.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -0,0 +1,104 @@ >>> +.\" Copyright (c) 2012 Fabien Thomas. 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. >>> +.\" >>> +.\" $FreeBSD$ >>> +.\" >>> +.Dd March 28, 2012 >>> +.Os >>> +.Dt PMC.SOFT 3 >>> +.Sh NAME >>> +.Nm pmc.soft >>> +.Nd measurements using software based events >>> +.Sh LIBRARY >>> +.Lb libpmc >>> +.Sh SYNOPSIS >>> +.In pmc.h >>> +.Sh DESCRIPTION >>> +Software events are used to collect various source of software = events. >>> +.Ss PMC Features >>> +16 sampling counters using software events based on various = sources. >>> +These PMCs support the following capabilities: >>> +.Bl -column "PMC_CAP_INTERRUPT" "Support" >>> +.It Em Capability Ta Em Support >>> +.It PMC_CAP_CASCADE Ta \&No >>> +.It PMC_CAP_EDGE Ta \&No >>> +.It PMC_CAP_INTERRUPT Ta Yes >>> +.It PMC_CAP_INVERT Ta \&No >>> +.It PMC_CAP_READ Ta Yes >>> +.It PMC_CAP_PRECISE Ta \&No >>> +.It PMC_CAP_SYSTEM Ta Yes >>> +.It PMC_CAP_TAGGING Ta \&No >>> +.It PMC_CAP_THRESHOLD Ta \&No >>> +.It PMC_CAP_USER Ta Yes >>> +.It PMC_CAP_WRITE Ta Yes >>> +.El >>> +.Ss Event Qualifiers >>> +There is no supported event qualifier. >>> +.Pp >>> +The event specifiers supported by software are: >>> +.Bl -tag -width indent >>> +.It Li CLOCK.HARD >>> +Hard clock ticks. >>> +.It Li CLOCK.STAT >>> +Stat clock ticks. >>> +.It Li LOCK.FAILED >>> +Lock acquisition failed. >>> +.It Li PAGE_FAULT.ALL >>> +All page fault type. >>> +.It Li PAGE_FAULT.READ >>> +Read page fault. >>> +.It Li PAGE_FAULT.WRITE >>> +Write page fault. >>> +.El >>> +.Sh SEE ALSO >>> +.Xr pmc 3 , >>> +.Xr pmc.atom 3 , >>> +.Xr pmc.core 3 , >>> +.Xr pmc.iaf 3 , >>> +.Xr pmc.ucf 3 , >>> +.Xr pmc.k7 3 , >>> +.Xr pmc.k8 3 , >>> +.Xr pmc.p4 3 , >>> +.Xr pmc.p5 3 , >>> +.Xr pmc.p6 3 , >>> +.Xr pmc.corei7 3 , >>> +.Xr pmc.corei7uc 3 , >>> +.Xr pmc.westmereuc 3 , >>> +.Xr pmc.tsc 3 , >>> +.Xr pmc_cpuinfo 3 , >>> +.Xr pmclog 3 , >>> +.Xr hwpmc 4 >>> +.Sh HISTORY >>> +The >>> +.Nm pmc >>> +library first appeared in >>> +.Fx 6.0 . >>> +.Sh AUTHORS >>> +The >>> +.Lb libpmc >>> +library was written by >>> +.An "Joseph Koshy" >>> +.Aq jkoshy@FreeBSD.org . >>> +Software PMC was written by >>> +.An "Fabien Thomas" >>> +.Aq fabient@FreeBSD.org . >>>=20 >>> Modified: head/lib/libpmc/pmc.tsc.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.tsc.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.tsc.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -68,6 +68,7 @@ maps to the TSC. >>> .Xr pmc.p4 3 , >>> .Xr pmc.p5 3 , >>> .Xr pmc.p6 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmclog 3 , >>> .Xr hwpmc 4 >>> .Sh HISTORY >>>=20 >>> Modified: head/lib/libpmc/pmc.ucf.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.ucf.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.ucf.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -96,6 +96,7 @@ offset C0H under device number 0 and Fun >>> .Xr pmc.corei7uc 3 , >>> .Xr pmc.westmere 3 , >>> .Xr pmc.westmereuc 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.westmere.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.westmere.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.westmere.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -1381,6 +1381,7 @@ Counts number of SID integer 64 bit shif >>> .Xr pmc.corei7 3 , >>> .Xr pmc.corei7uc 3 , >>> .Xr pmc.westmereuc 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.westmereuc.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.westmereuc.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.westmereuc.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -1066,6 +1066,7 @@ disabled. >>> .Xr pmc.corei7 3 , >>> .Xr pmc.corei7uc 3 , >>> .Xr pmc.westmere 3 , >>> +.Xr pmc.soft 3 , >>> .Xr pmc.tsc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>>=20 >>> Modified: head/lib/libpmc/pmc.xscale.3 >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmc.xscale.3 Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmc.xscale.3 Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -134,6 +134,7 @@ and the underlying hardware events used. >>> .Xr pmc 3 , >>> .Xr pmc_cpuinfo 3 , >>> .Xr pmclog 3 , >>> +.Xr pmc.soft 3 , >>> .Xr hwpmc 4 >>> .Sh HISTORY >>> The >>>=20 >>> Modified: head/lib/libpmc/pmclog.c >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmclog.c Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmclog.c Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -369,6 +369,12 @@ pmclog_get_event(void *cookie, char **da >>> =3D=3D NULL) >>> goto error; >>> break; >>> + case PMCLOG_TYPE_PMCALLOCATEDYN: >>> + PMCLOG_READ32(le,ev->pl_u.pl_ad.pl_pmcid); >>> + PMCLOG_READ32(le,ev->pl_u.pl_ad.pl_event); >>> + PMCLOG_READ32(le,ev->pl_u.pl_ad.pl_flags); >>> + = PMCLOG_READSTRING(le,ev->pl_u.pl_ad.pl_evname,PMC_NAME_MAX); >>> + break; >>> case PMCLOG_TYPE_PMCATTACH: >>> PMCLOG_GET_PATHLEN(pathlen,evlen,pmclog_pmcattach); >>> PMCLOG_READ32(le,ev->pl_u.pl_t.pl_pmcid); >>>=20 >>> Modified: head/lib/libpmc/pmclog.h >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/lib/libpmc/pmclog.h Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/lib/libpmc/pmclog.h Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -88,6 +88,13 @@ struct pmclog_ev_pmcallocate { >>> pmc_id_t pl_pmcid; >>> }; >>>=20 >>> +struct pmclog_ev_pmcallocatedyn { >>> + uint32_t pl_event; >>> + char pl_evname[PMC_NAME_MAX]; >>> + uint32_t pl_flags; >>> + pmc_id_t pl_pmcid; >>> +}; >>> + >>> struct pmclog_ev_pmcattach { >>> pmc_id_t pl_pmcid; >>> pid_t pl_pid; >>> @@ -146,6 +153,7 @@ struct pmclog_ev { >>> struct pmclog_ev_map_out pl_mo; >>> struct pmclog_ev_pcsample pl_s; >>> struct pmclog_ev_pmcallocate pl_a; >>> + struct pmclog_ev_pmcallocatedyn pl_ad; >>> struct pmclog_ev_pmcattach pl_t; >>> struct pmclog_ev_pmcdetach pl_d; >>> struct pmclog_ev_proccsw pl_c; >>>=20 >>> Modified: head/sys/amd64/amd64/trap.c >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/sys/amd64/amd64/trap.c Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/sys/amd64/amd64/trap.c Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -71,6 +71,9 @@ __FBSDID("$FreeBSD$"); >>> #include >>> #ifdef HWPMC_HOOKS >>> #include >>> +PMC_SOFT_DEFINE( , , page_fault, all); >>> +PMC_SOFT_DEFINE( , , page_fault, read); >>> +PMC_SOFT_DEFINE( , , page_fault, write); >>> #endif >>>=20 >>> #include >>> @@ -743,8 +746,20 @@ trap_pfault(frame, usermode) >>> */ >>> rv =3D vm_fault(map, va, ftype, VM_FAULT_NORMAL); >>> } >>> - if (rv =3D=3D KERN_SUCCESS) >>> + if (rv =3D=3D KERN_SUCCESS) { >>> +#ifdef HWPMC_HOOKS >>> + if (ftype =3D=3D VM_PROT_READ || ftype =3D=3D = VM_PROT_WRITE) { >>> + PMC_SOFT_CALL_TF( , , page_fault, all, = frame); >>> + if (ftype =3D=3D VM_PROT_READ) >>> + PMC_SOFT_CALL_TF( , , page_fault, = read, >>> + frame); >>> + else >>> + PMC_SOFT_CALL_TF( , , page_fault, = write, >>> + frame); >>> + } >>> +#endif >>> return (0); >>> + } >>> nogo: >>> if (!usermode) { >>> if (td->td_intr_nesting_level =3D=3D 0 && >>>=20 >>> Modified: head/sys/amd64/include/pmc_mdep.h >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/sys/amd64/include/pmc_mdep.h Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/sys/amd64/include/pmc_mdep.h Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -50,13 +50,13 @@ struct pmc_mdep; >>> * measurement architecture have PMCs of the following classes: TSC, >>> * IAF, IAP, UCF and UCP. >>> */ >>> -#define PMC_MDEP_CLASS_INDEX_TSC 0 >>> -#define PMC_MDEP_CLASS_INDEX_K8 1 >>> -#define PMC_MDEP_CLASS_INDEX_P4 1 >>> -#define PMC_MDEP_CLASS_INDEX_IAP 1 >>> -#define PMC_MDEP_CLASS_INDEX_IAF 2 >>> -#define PMC_MDEP_CLASS_INDEX_UCP 3 >>> -#define PMC_MDEP_CLASS_INDEX_UCF 4 >>> +#define PMC_MDEP_CLASS_INDEX_TSC 1 >>> +#define PMC_MDEP_CLASS_INDEX_K8 2 >>> +#define PMC_MDEP_CLASS_INDEX_P4 2 >>> +#define PMC_MDEP_CLASS_INDEX_IAP 2 >>> +#define PMC_MDEP_CLASS_INDEX_IAF 3 >>> +#define PMC_MDEP_CLASS_INDEX_UCP 4 >>> +#define PMC_MDEP_CLASS_INDEX_UCF 5 >>>=20 >>> /* >>> * On the amd64 platform we support the following PMCs. >>> @@ -119,6 +119,15 @@ union pmc_md_pmc { >>>=20 >>> #define PMC_IN_USERSPACE(va) ((va) <=3D VM_MAXUSER_ADDRESS) >>>=20 >>> +/* Build a fake kernel trapframe from current instruction pointer. = */ >>> +#define PMC_FAKE_TRAPFRAME(TF) = \ >>> + do { = \ >>> + (TF)->tf_cs =3D 0; (TF)->tf_rflags =3D 0; = \ >>> + __asm __volatile("movq %%rbp,%0" : "=3Dr" ((TF)->tf_rbp)); = \ >>> + __asm __volatile("movq %%rsp,%0" : "=3Dr" ((TF)->tf_rsp)); = \ >>> + __asm __volatile("call 1f \n\t1: pop %0" : = "=3Dr"((TF)->tf_rip)); \ >>> + } while (0) >>> + >>> /* >>> * Prototypes >>> */ >>>=20 >>> Modified: head/sys/arm/include/pmc_mdep.h >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/sys/arm/include/pmc_mdep.h Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/sys/arm/include/pmc_mdep.h Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -29,7 +29,7 @@ >>> #ifndef _MACHINE_PMC_MDEP_H_ >>> #define _MACHINE_PMC_MDEP_H_ >>>=20 >>> -#define PMC_MDEP_CLASS_INDEX_XSCALE 0 >>> +#define PMC_MDEP_CLASS_INDEX_XSCALE 1 >>> /* >>> * On the ARM platform we support the following PMCs. >>> * >>>=20 >>> Modified: head/sys/conf/files >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/sys/conf/files Wed Mar 28 20:49:11 2012 (r233627) >>> +++ head/sys/conf/files Wed Mar 28 20:58:30 2012 (r233628) >>> @@ -1260,6 +1260,7 @@ dev/hme/if_hme_sbus.c optional hme = sbus >>> dev/hptiop/hptiop.c optional hptiop scbus >>> dev/hwpmc/hwpmc_logging.c optional hwpmc >>> dev/hwpmc/hwpmc_mod.c optional hwpmc >>> +dev/hwpmc/hwpmc_soft.c optional hwpmc >>> dev/ichsmb/ichsmb.c optional ichsmb >>> dev/ichsmb/ichsmb_pci.c optional ichsmb pci >>> dev/ida/ida.c optional ida >>>=20 >>> Modified: head/sys/dev/hwpmc/hwpmc_amd.c >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/sys/dev/hwpmc/hwpmc_amd.c Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/sys/dev/hwpmc/hwpmc_amd.c Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -687,7 +687,8 @@ amd_intr(int cpu, struct trapframe *tf) >>> wrmsr(perfctr, AMD_RELOAD_COUNT_TO_PERFCTR_VALUE(v)); >>>=20 >>> /* Restart the counter if logging succeeded. */ >>> - error =3D pmc_process_interrupt(cpu, pm, tf, = TRAPF_USERMODE(tf)); >>> + error =3D pmc_process_interrupt(cpu, PMC_HR, pm, tf, >>> + TRAPF_USERMODE(tf)); >>> if (error =3D=3D 0) >>> wrmsr(evsel, config | AMD_PMC_ENABLE); >>> } >>> @@ -874,7 +875,7 @@ amd_pcpu_fini(struct pmc_mdep *md, int c >>> struct pmc_mdep * >>> pmc_amd_initialize(void) >>> { >>> - int classindex, error, i, nclasses, ncpus; >>> + int classindex, error, i, ncpus; >>> struct pmc_classdep *pcd; >>> enum pmc_cputype cputype; >>> struct pmc_mdep *pmc_mdep; >>> @@ -926,12 +927,9 @@ pmc_amd_initialize(void) >>> * These processors have two classes of PMCs: the TSC and >>> * programmable PMCs. >>> */ >>> - nclasses =3D 2; >>> - pmc_mdep =3D malloc(sizeof(struct pmc_mdep) + nclasses * = sizeof (struct pmc_classdep), >>> - M_PMC, M_WAITOK|M_ZERO); >>> + pmc_mdep =3D pmc_mdep_alloc(2); >>>=20 >>> pmc_mdep->pmd_cputype =3D cputype; >>> - pmc_mdep->pmd_nclass =3D nclasses; >>>=20 >>> ncpus =3D pmc_cpu_max(); >>>=20 >>>=20 >>> Modified: head/sys/dev/hwpmc/hwpmc_core.c >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/sys/dev/hwpmc/hwpmc_core.c Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/sys/dev/hwpmc/hwpmc_core.c Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -2239,7 +2239,7 @@ core_intr(int cpu, struct trapframe *tf) >>> if (pm->pm_state !=3D PMC_STATE_RUNNING) >>> continue; >>>=20 >>> - error =3D pmc_process_interrupt(cpu, pm, tf, >>> + error =3D pmc_process_interrupt(cpu, PMC_HR, pm, tf, >>> TRAPF_USERMODE(tf)); >>>=20 >>> v =3D pm->pm_sc.pm_reloadcount; >>> @@ -2326,7 +2326,7 @@ core2_intr(int cpu, struct trapframe *tf >>> !PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) >>> continue; >>>=20 >>> - error =3D pmc_process_interrupt(cpu, pm, tf, >>> + error =3D pmc_process_interrupt(cpu, PMC_HR, pm, tf, >>> TRAPF_USERMODE(tf)); >>> if (error) >>> intrenable &=3D ~flag; >>> @@ -2354,7 +2354,7 @@ core2_intr(int cpu, struct trapframe *tf >>> !PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) >>> continue; >>>=20 >>> - error =3D pmc_process_interrupt(cpu, pm, tf, >>> + error =3D pmc_process_interrupt(cpu, PMC_HR, pm, tf, >>> TRAPF_USERMODE(tf)); >>> if (error) >>> intrenable &=3D ~flag; >>>=20 >>> Modified: head/sys/dev/hwpmc/hwpmc_intel.c >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/sys/dev/hwpmc/hwpmc_intel.c Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/sys/dev/hwpmc/hwpmc_intel.c Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -162,12 +162,10 @@ pmc_intel_initialize(void) >>> return (NULL); >>> } >>>=20 >>> - pmc_mdep =3D malloc(sizeof(struct pmc_mdep) + nclasses * >>> - sizeof(struct pmc_classdep), M_PMC, M_WAITOK|M_ZERO); >>> + /* Allocate base class and initialize machine dependent = struct */ >>> + pmc_mdep =3D pmc_mdep_alloc(nclasses); >>>=20 >>> pmc_mdep->pmd_cputype =3D cputype; >>> - pmc_mdep->pmd_nclass =3D nclasses; >>> - >>> pmc_mdep->pmd_switch_in =3D intel_switch_in; >>> pmc_mdep->pmd_switch_out =3D intel_switch_out; >>>=20 >>>=20 >>> Modified: head/sys/dev/hwpmc/hwpmc_logging.c >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/sys/dev/hwpmc/hwpmc_logging.c Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/sys/dev/hwpmc/hwpmc_logging.c Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -129,6 +129,7 @@ static struct mtx pmc_kthread_mtx; /* sl >>>=20 >>> /* Emit a string. Caution: does NOT update _le, so needs to be = last */ >>> #define PMCLOG_EMITSTRING(S,L) do { bcopy((S), _le, (L)); } = while (0) >>> +#define PMCLOG_EMITNULLSTRING(L) do { bzero(_le, (L)); } = while (0) >>>=20 >>> #define PMCLOG_DESPATCH(PO) = \ >>> pmclog_release((PO)); = \ >>> @@ -835,16 +836,33 @@ void >>> pmclog_process_pmcallocate(struct pmc *pm) >>> { >>> struct pmc_owner *po; >>> + struct pmc_soft *ps; >>>=20 >>> po =3D pm->pm_owner; >>>=20 >>> PMCDBG(LOG,ALL,1, "pm=3D%p", pm); >>>=20 >>> - PMCLOG_RESERVE(po, PMCALLOCATE, sizeof(struct = pmclog_pmcallocate)); >>> - PMCLOG_EMIT32(pm->pm_id); >>> - PMCLOG_EMIT32(pm->pm_event); >>> - PMCLOG_EMIT32(pm->pm_flags); >>> - PMCLOG_DESPATCH(po); >>> + if (PMC_TO_CLASS(pm) =3D=3D PMC_CLASS_SOFT) { >>> + PMCLOG_RESERVE(po, PMCALLOCATEDYN, >>> + sizeof(struct pmclog_pmcallocatedyn)); >>> + PMCLOG_EMIT32(pm->pm_id); >>> + PMCLOG_EMIT32(pm->pm_event); >>> + PMCLOG_EMIT32(pm->pm_flags); >>> + ps =3D pmc_soft_ev_acquire(pm->pm_event); >>> + if (ps !=3D NULL) >>> + = PMCLOG_EMITSTRING(ps->ps_ev.pm_ev_name,PMC_NAME_MAX); >>> + else >>> + PMCLOG_EMITNULLSTRING(PMC_NAME_MAX); >>> + pmc_soft_ev_release(ps); >>> + PMCLOG_DESPATCH(po); >>> + } else { >>> + PMCLOG_RESERVE(po, PMCALLOCATE, >>> + sizeof(struct pmclog_pmcallocate)); >>> + PMCLOG_EMIT32(pm->pm_id); >>> + PMCLOG_EMIT32(pm->pm_event); >>> + PMCLOG_EMIT32(pm->pm_flags); >>> + PMCLOG_DESPATCH(po); >>> + } >>> } >>>=20 >>> void >>>=20 >>> Modified: head/sys/dev/hwpmc/hwpmc_mips.c >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/sys/dev/hwpmc/hwpmc_mips.c Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/sys/dev/hwpmc/hwpmc_mips.c Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -287,7 +287,7 @@ mips_pmc_intr(int cpu, struct trapframe >>> retval =3D 1; >>> if (pm->pm_state !=3D PMC_STATE_RUNNING) >>> continue; >>> - error =3D pmc_process_interrupt(cpu, pm, tf, >>> + error =3D pmc_process_interrupt(cpu, PMC_HR, pm, tf, >>> TRAPF_USERMODE(tf)); >>> if (error) { >>> /* Clear/disable the relevant counter */ >>>=20 >>> Modified: head/sys/dev/hwpmc/hwpmc_mod.c >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/sys/dev/hwpmc/hwpmc_mod.c Wed Mar 28 20:49:11 2012 = (r233627) >>> +++ head/sys/dev/hwpmc/hwpmc_mod.c Wed Mar 28 20:58:30 2012 = (r233628) >>> @@ -70,6 +70,8 @@ __FBSDID("$FreeBSD$"); >>> #include >>> #include >>>=20 >>> +#include "hwpmc_soft.h" >>> + >>> /* >>> * Types >>> */ >>> @@ -182,7 +184,7 @@ static int pmc_attach_one_process(struct >>> static int pmc_can_allocate_rowindex(struct proc *p, unsigned = int ri, >>> int cpu); >>> static int pmc_can_attach(struct pmc *pm, struct proc *p); >>> -static void pmc_capture_user_callchain(int cpu, struct trapframe = *tf); >>> +static void pmc_capture_user_callchain(int cpu, int soft, struct = trapframe *tf); >>> static void pmc_cleanup(void); >>> static int pmc_detach_process(struct proc *p, struct pmc *pm); >>> static int pmc_detach_one_process(struct proc *p, struct pmc = *pm, >>> @@ -206,7 +208,7 @@ static void pmc_process_csw_out(struct t >>> static void pmc_process_exit(void *arg, struct proc *p); >>> static void pmc_process_fork(void *arg, struct proc *p1, >>> struct proc *p2, int n); >>> -static void pmc_process_samples(int cpu); >>> +static void pmc_process_samples(int cpu, int soft); >>> static void pmc_release_pmc_descriptor(struct pmc *pmc); >>> static void pmc_remove_owner(struct pmc_owner *po); >>> static void pmc_remove_process_descriptor(struct pmc_process = *pp); >>> @@ -218,12 +220,16 @@ static int pmc_stop(struct pmc *pm); >>> static int pmc_syscall_handler(struct thread *td, void = *syscall_args); >>> static void pmc_unlink_target_process(struct pmc *pmc, >>> struct pmc_process *pp); >>> +static int generic_switch_in(struct pmc_cpu *pc, struct pmc_process = *pp); >>> +static int generic_switch_out(struct pmc_cpu *pc, struct = pmc_process *pp); >>> +static struct pmc_mdep *pmc_generic_cpu_initialize(void); >>> +static void pmc_generic_cpu_finalize(struct pmc_mdep *md); >>>=20 >>> /* >>> * Kernel tunables and sysctl(8) interface. >>> */ >>>=20 >>> -SYSCTL_NODE(_kern, OID_AUTO, hwpmc, CTLFLAG_RW, 0, "HWPMC = parameters"); >>> +SYSCTL_DECL(_kern_hwpmc); >>>=20 >>> static int pmc_callchaindepth =3D PMC_CALLCHAIN_DEPTH; >>> TUNABLE_INT(PMC_SYSCTL_NAME_PREFIX "callchaindepth", = &pmc_callchaindepth); >>> @@ -1833,7 +1839,9 @@ const char *pmc_hooknames[] =3D { >>> "KLDUNLOAD", >>> "MMAP", >>> "MUNMAP", >>> - "CALLCHAIN" >>> + "CALLCHAIN-NMI", >>> + "CALLCHAIN-SOFT", >>> + "SOFTSAMPLING" >>> }; >>> #endif >>>=20 >>> @@ -1992,7 +2000,8 @@ pmc_hook_handler(struct thread *td, int >>> * lose the interrupt sample. >>> */ >>> CPU_CLR_ATOMIC(PCPU_GET(cpuid), &pmc_cpumask); >>> - pmc_process_samples(PCPU_GET(cpuid)); >>> + pmc_process_samples(PCPU_GET(cpuid), PMC_HR); >>> + pmc_process_samples(PCPU_GET(cpuid), PMC_SR); >>> break; >>>=20 >>>=20 >>> @@ -2022,11 +2031,30 @@ pmc_hook_handler(struct thread *td, int >>> */ >>> KASSERT(td =3D=3D curthread, ("[pmc,%d] td !=3D = curthread", >>> __LINE__)); >>> - pmc_capture_user_callchain(PCPU_GET(cpuid), >>> + >>> + pmc_capture_user_callchain(PCPU_GET(cpuid), PMC_HR, >>> (struct trapframe *) arg); >>> td->td_pflags &=3D ~TDP_CALLCHAIN; >>> break; >>>=20 >>> + case PMC_FN_USER_CALLCHAIN_SOFT: >>> + /* >>> + * Record a call chain. >>> + */ >>> + KASSERT(td =3D=3D curthread, ("[pmc,%d] td !=3D = curthread", >>> + __LINE__)); >>> + pmc_capture_user_callchain(PCPU_GET(cpuid), PMC_SR, >>> + (struct trapframe *) arg); >>> + td->td_pflags &=3D ~TDP_CALLCHAIN; >>> + break; >>> + >>> + case PMC_FN_SOFT_SAMPLING: >>> + /* >>> + * Call soft PMC sampling intr. >>> + */ >>> + pmc_soft_intr((struct pmckern_soft *) arg); >>> + break; >>> + >>> default: >>> #ifdef DEBUG >>> KASSERT(0, ("[pmc,%d] unknown hook %d\n", __LINE__, = function)); >>> @@ -2221,18 +2249,17 @@ pmc_destroy_pmc_descriptor(struct pmc *p >>> static void >>> pmc_wait_for_pmc_idle(struct pmc *pm) >>> { >>> -#ifdef DEBUG >>> +#ifdef DEBUG >>> volatile int maxloop; >>>=20 >>> maxloop =3D 100 * pmc_cpu_max(); >>> #endif >>> - >>> /* >>> * Loop (with a forced context switch) till the PMC's = runcount >>> * comes down to zero. >>> */ >>> while (atomic_load_acq_32(&pm->pm_runcount) > 0) { >>> -#ifdef DEBUG >>> +#ifdef DEBUG >>> maxloop--; >>> KASSERT(maxloop > 0, >>> ("[pmc,%d] (ri%d, rc%d) waiting too long for " >>> @@ -2972,6 +2999,53 @@ pmc_syscall_handler(struct thread *td, v >>> } >>> break; >>>=20 >>> + /* >>> + * Retrieve soft events list. >>> + */ >>> + case PMC_OP_GETDYNEVENTINFO: >>> + { >>> + enum pmc_class cl; >>> + enum pmc_event ev; >>> + struct pmc_op_getdyneventinfo *gei; >>> + struct pmc_dyn_event_descr dev; >>> + struct pmc_soft *ps; >>> + uint32_t nevent; >>> + >>> + sx_assert(&pmc_sx, SX_LOCKED); >>> + >>> + gei =3D (struct pmc_op_getdyneventinfo *) arg; >>> + >>> + if ((error =3D copyin(&gei->pm_class, &cl, = sizeof(cl))) !=3D 0) >>> + break; >>> + >>> + /* Only SOFT class is dynamic. */ >>> + if (cl !=3D PMC_CLASS_SOFT) { >>> + error =3D EINVAL; >>> + break; >>> + } >>> + >>> + nevent =3D 0; >>> + for (ev =3D PMC_EV_SOFT_FIRST; ev <=3D = PMC_EV_SOFT_LAST; ev++) { >>> + ps =3D pmc_soft_ev_acquire(ev); >>> + if (ps =3D=3D NULL) >>> + continue; >>> + bcopy(&ps->ps_ev, &dev, sizeof(dev)); >>> + pmc_soft_ev_release(ps); >>> + >>> + error =3D copyout(&dev, >>> + &gei->pm_events[nevent], >>> + sizeof(struct pmc_dyn_event_descr)); >>> + if (error !=3D 0) >>> + break; >>> + nevent++; >>> + } >>> + if (error !=3D 0) >>> + break; >>> + >>> + error =3D copyout(&nevent, &gei->pm_nevent, >>>=20 >>> *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** >=20 >=20 >=20 > --=20 > Monthadar Al Jaberi > --Apple-Mail=_0FFE1445-1962-4A52-A902-4106C0401133-- --Apple-Mail=_24EA901A-324C-4465-880C-9C948861B2D8--