Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Apr 2012 09:47:45 +0200
From:      Fabien Thomas <fabien.thomas@netasq.com>
To:        Monthadar Al Jaberi <monthadar@gmail.com>
Cc:        monthadar@freebsd.org, freebsd-current <freebsd-current@freebsd.org>, Fabien Thomas <fabient@freebsd.org>, 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...
Message-ID:  <25D59FAA-D52A-42FB-8120-66467863AB0B@netasq.com>
In-Reply-To: <CA%2BsBSoJ_5OrgeD_K%2BpM18%2BW9MomYTiierrD8bvZ0Kk4t6su=AQ@mail.gmail.com>
References:  <201203282058.q2SKwVsJ053900@svn.freebsd.org> <CAJ-Vmok-JHRsnwh5j2vnw54ccVSDOoYHCut_N9wfohsQSvOaZA@mail.gmail.com> <CA%2BsBSoJ_5OrgeD_K%2BpM18%2BW9MomYTiierrD8bvZ0Kk4t6su=AQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--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 <adrian@freebsd.org> =
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<PerfCount,WatchRegs,MIPS16,EJTAG>
>  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: <MIPS32 root nexus>
> clock0: <Generic MIPS32 ticker> 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: <Atheros AR71XX GPIO driver> on apb0
> gpio0: [GIANT-LOCKED]
> gpio0: gpio pinmask=3D0x0
> gpioc0: <GPIO controller> on gpio0
> gpiobus0: <GPIO bus> on gpio0
> ehci0: <AR71XX Integrated USB 2.0 controller> 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: <PCI bus> on pcib0
> pci0: <old, non-VGA display device> at device 0.0 (no driver attached)
> ath0: <Atheros 5413> 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: <Atheros AR71xx built-in ethernet interface> at mem
> 0x19000000-0x19000fff irq 2 on nexus0
> arge0: No PHY specified, using mask 16
> miibus0: <MII bus> on arge0
> ukphy0: <Generic IEEE 802.3u media interface> 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: <Atheros AR71xx built-in ethernet interface> 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: <AR71XX SPI> at mem 0x1f000000-0x1f00000f on nexus0
> spibus0: <spibus bus> on spi0
> mx25l0: <M25Pxx Flash Family> at cs 0 on spibus0
> mx25l0: mx25ll128, sector 65536 bytes, 256 sectors
> ar71xx_wdog0: <Atheros AR71XX watchdog timer> on nexus0
> Timecounters tick every 1.000 msec
> usbus0: 480Mbps High Speed USB v2.0
> ugen0.1: <Atheros> at usbus0
> uhub0: <Atheros EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> 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 <fabient@freebsd.org> 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 <sys/vmmeter.h>
>>>  #ifdef HWPMC_HOOKS
>>>  #include <sys/pmckern.h>
>>> +PMC_SOFT_DEFINE( , , page_fault, all);
>>> +PMC_SOFT_DEFINE( , , page_fault, read);
>>> +PMC_SOFT_DEFINE( , , page_fault, write);
>>>  #endif
>>>=20
>>>  #include <vm/vm.h>
>>> @@ -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 <vm/vm_map.h>
>>>  #include <vm/vm_object.h>
>>>=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
> <RSPRO_USB_PROD>


--Apple-Mail=_0FFE1445-1962-4A52-A902-4106C0401133--

--Apple-Mail=_24EA901A-324C-4465-880C-9C948861B2D8--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?25D59FAA-D52A-42FB-8120-66467863AB0B>