@@ -94,6 +94,41 @@ uint64_t get_cyclecounter(void)
9494 __asm __volatile ("mrs %[retval], pmccntr_el0\n" : [retval ] "=r" (retval ));
9595 return retval ;
9696}
97+ #elif defined(__ARM_ARCH_8_1M_MAIN__) || defined(__ARM_FEATURE_MVE)
98+ #include <ARMCM55.h>
99+ #include <system_ARMCM55.h>
100+ #include <uart.h>
101+ #include "pmu_armv8.h"
102+
103+ volatile uint64_t v8m_pmu_cycles ;
104+ void DebugMon_Handler (void ) {
105+ uint32_t ovsclr ;
106+ ARM_PMU_CNTR_Disable (PMU_CNTENSET_CCNTR_ENABLE_Msk );
107+ v8m_pmu_cycles += ARM_PMU_Get_CCNTR ();
108+ ovsclr = ARM_PMU_Get_CNTR_OVS ();
109+ ARM_PMU_Set_CNTR_OVS (ovsclr );
110+ ARM_PMU_CYCCNT_Reset ();
111+ ARM_PMU_CNTR_Enable (PMU_CNTENSET_CCNTR_ENABLE_Msk );
112+ }
113+ void enable_cyclecounter (void )
114+ {
115+ CoreDebug -> DEMCR |= CoreDebug_DEMCR_TRCENA_Msk | CoreDebug_DEMCR_MON_EN_Msk ;
116+ ARM_PMU_Enable ();
117+
118+ v8m_pmu_cycles = 0 ;
119+ ARM_PMU_CYCCNT_Reset ();
120+ }
121+ void disable_cyclecounter (void )
122+ {
123+ ARM_PMU_Disable ();
124+ CoreDebug -> DEMCR &= (~CoreDebug_DEMCR_TRCENA_Msk ) & (~CoreDebug_DEMCR_MON_EN_Msk );
125+ }
126+ uint64_t get_cyclecounter (void )
127+ {
128+ v8m_pmu_cycles += ARM_PMU_Get_CCNTR ();
129+ ARM_PMU_CYCCNT_Reset ();
130+ return v8m_pmu_cycles ;
131+ }
97132
98133#else
99134#error PMU_CYCLES option only supported on x86_64 and AArch64
@@ -305,6 +340,56 @@ uint64_t get_cyclecounter(void)
305340 return g_counters [2 ];
306341}
307342
343+ #elif defined(SYSTICK_CYCLES)
344+ #include <ARMCM55.h>
345+ #include <system_ARMCM55.h>
346+ static volatile uint32_t systick_overflows ;
347+ void SysTick_Handler (void )
348+ {
349+ uint32_t cnt ;
350+ uint32_t fail ;
351+ do {
352+ __asm__ volatile (
353+ "ldrex %[val], [%[guard]]\n"
354+ "addw %[val], %[val], #1\n"
355+ "strex %[fail], %[val], [%[guard]]\n"
356+ :[fail ] "=r" (fail ), [val ] "=&r" (cnt )
357+ :[guard ] "r" (& systick_overflows ) : "memory" );
358+ } while (fail );
359+ }
360+
361+ void enable_cyclecounter (void ) {
362+ uint32_t cnt ;
363+ uint32_t fail ;
364+ do {
365+ __asm__ volatile ("ldrex.w %[val], [%[guard]]"
366+ :[val ] "=&r" (cnt )
367+ :[guard ] "r" (& systick_overflows ));
368+ cnt = 0 ;
369+ __asm__ volatile ("strex.w %[fail], %[val], [%[guard]]"
370+ :[fail ] "=r" (fail ), [val ] "=&r" (cnt )
371+ :[guard ] "r" (& systick_overflows ) : "memory" );
372+ } while (fail );
373+ SysTick_Config (0xFFFFFFu );
374+ }
375+
376+ void disable_cyclecounter (void ) { return ; }
377+
378+ uint64_t get_cyclecounter (void ) {
379+ uint32_t val ;
380+ uint32_t cnt ;
381+ uint32_t fail ;
382+ do {
383+ __asm__ volatile (
384+ "ldrex %[cnt], [%[guard]]\n"
385+ "ldr %[val], [%[systv]]\n"
386+ "strex %[fail], %[cnt], [%[guard]]\n"
387+ :[fail ] "=r" (fail ), [cnt ] "=&r" (cnt ), [val ] "=r" (val )
388+ :[guard ] "r" (& systick_overflows ), [systv ] "r" (& (SysTick -> VAL )): "memory" );
389+ } while (fail );
390+ return ((uint64_t )cnt + 1 ) * 16777216llu - val ;
391+ }
392+
308393#else
309394
310395void enable_cyclecounter (void ) { return ; }
0 commit comments