diff options
| author | Simon Rettberg | 2026-01-28 12:53:53 +0100 |
|---|---|---|
| committer | Simon Rettberg | 2026-01-28 12:53:53 +0100 |
| commit | 8e82785c584dc13e20f9229decb95bd17bbe9cd1 (patch) | |
| tree | a8b359e59196be5b2e3862bed189107f4bc9975f /src/arch/arm32/include/bits/profile.h | |
| parent | Merge branch 'master' into openslx (diff) | |
| parent | [prefix] Make unlzma.S compatible with 386 class CPUs (diff) | |
| download | ipxe-openslx.tar.gz ipxe-openslx.tar.xz ipxe-openslx.zip | |
Merge branch 'master' into openslxopenslx
Diffstat (limited to 'src/arch/arm32/include/bits/profile.h')
| -rw-r--r-- | src/arch/arm32/include/bits/profile.h | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/arch/arm32/include/bits/profile.h b/src/arch/arm32/include/bits/profile.h index 2b15d1604..31c321884 100644 --- a/src/arch/arm32/include/bits/profile.h +++ b/src/arch/arm32/include/bits/profile.h @@ -11,19 +11,30 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <stdint.h> +extern uint32_t pmccntr_status; + /** * Get profiling timestamp * * @ret timestamp Timestamp */ -static inline __attribute__ (( always_inline )) uint64_t +static inline __attribute__ (( always_inline )) unsigned long profile_timestamp ( void ) { uint32_t cycles; /* Read cycle counter */ - __asm__ __volatile__ ( "mcr p15, 0, %1, c9, c12, 0\n\t" - "mrc p15, 0, %0, c9, c13, 0\n\t" - : "=r" ( cycles ) : "r" ( 1 ) ); + __asm__ __volatile__ ( /* Check PMCCNTR status */ + "tst %0, %0\n\t" + /* Check availability if not yet known */ + "it mi\n\t" + "blxmi pmccntr_check\n\t" + /* Read PMCCNTR if available */ + "it ne\n\t" + "mrcne p15, 0, %0, c9, c13, 0\n\t" + "\n1:\n\t" + : "=r" ( cycles ) + : "0" ( pmccntr_status ) + : "cc", "lr" ); return cycles; } |
