I'm running the code NOT under linux, but with code-composer, and here
what works for me:
int Counter_uSec = 0;
void counters_init( void )
{
int pmuserenr=0;
int pmcr=0;
pmuserenr = readPMUSERENR();
writePMCR_Ebit(1); /* enable the A8 counters */
writePMCR_Dbit(0); /* no clock divider */
pmcr = readPMCR();
enableCycleCounter();
writePMCNTENSET_eventCounters(0xf); /* enable all the user counters
*/
setupEventCounter(Counter0, EventTypeInstructions);
setupEventCounter(Counter1, EventTypeICacheMisses);
setupEventCounter(Counter2, EventTypeDCacheMisses);
setupEventCounter(Counter3, EventTypeCycleCount);
Counter_uSec = 0;
resetAllCounters();
}
;****************************************************************
int GetCounter( void )
{
unsigned int c2 = readCycleCounter();
resetAllCounters();
c2 = c2 / 484; // 331;
Counter_uSec += c2;
return c2;
}
;****************************************************************
;****************************************************************
;****************************************************************
;****************************************************************
.global _writePMCR_Ebit
_writePMCR_Ebit:
mrc p15, #0, r1, c9, c12, #0
AND r0,r0,#0x3
BIC r1,r1,#0x3
ORR r1,r1,r0
mcr p15, #0, r1, c9, c12, #0
bx lr
;****************************************************************
.global _readPMUSERENR
_readPMUSERENR:
mrc p15, #0, r0, c9, c14, #0
bx lr
;****************************************************************
; unsigned int readPMCR(void)
; Read the Performance Monitor Control Register
.global _readPMCR
_readPMCR:
mrc p15, #0, r0, c9, c12, #0
bx lr
;****************************************************************
; void enableCycleCounter(void)
; enable the cycle counter register
.global _enableCycleCounter
_enableCycleCounter:
mov r1, #1
mov r1, r1, lsl #31
mrc p15, #0, r0, c9, c12, #1
orr r0, r0, r1
mcr p15, #0, r0, c9, c12, #1
bx lr
;****************************************************************
; void writePMCNTENSET_eventCounters(int eventCounters)
; Write to Count Enable Set Register event counters (PMCNTENSET)
.global _writePMCNTENSET_eventCounters
_writePMCNTENSET_eventCounters:
; was bug...need high order bit set to enable counter
orr r0,r0, #0x80000000
mcr p15, #0, r0, c9, c12, #1
bx lr
;****************************************************************
; void setupEventCounter(int eventNumber, int eventType)
; setup event number to type of event to count
.global _setupEventCounter
_setupEventCounter:
mcr p15, #0, r0, c9, c12, #5
mcr p15, #0, r1, c9, c13, #1
bx lr
;****************************************************************
; void resetAllCounters(void)
; Reset all counters including the cycle counter
; Write to the Performance Monitor Control Register C-bit and P-bits,
bit[3:2]
.global _resetAllCounters
_resetAllCounters:
mrc p15, #0, r1, c9, c12, #0
orr r1, r1, #0x6 ; set C, E bits to 1 - 'P=clear user counters',
C="clear clock counter'
mcr p15, #0, r1, c9, c12, #0 ; reset the counters
bx lr
;****************************************************************
; unsigned int readCycleCounter(void)
; read cycle counter register
.global _readCycleCounter
_readCycleCounter:
mrc p15, #0, r0, c9, c13, #0
bx lr
Yuli Kaplunovsky
yk@magniel.com
+1 408 884 5965