File tree Expand file tree Collapse file tree 2 files changed +102
-1
lines changed Expand file tree Collapse file tree 2 files changed +102
-1
lines changed Original file line number Diff line number Diff line change 13
13
#include <internal/lib.h>
14
14
#include <linux/kernel.h>
15
15
#include <linux/math64.h>
16
+ #include <linux/stringify.h>
16
17
#include "internal.h"
17
18
18
19
void perf_mmap__init (struct perf_mmap * map , struct perf_mmap * prev ,
@@ -294,6 +295,103 @@ static u64 read_timestamp(void)
294
295
295
296
return low | ((u64 )high ) << 32 ;
296
297
}
298
+ #elif defined(__aarch64__ )
299
+ #define read_sysreg (r ) ({ \
300
+ u64 __val; \
301
+ asm volatile("mrs %0, " __stringify(r) : "=r" (__val)); \
302
+ __val; \
303
+ })
304
+
305
+ static u64 read_pmccntr (void )
306
+ {
307
+ return read_sysreg (pmccntr_el0 );
308
+ }
309
+
310
+ #define PMEVCNTR_READ (idx ) \
311
+ static u64 read_pmevcntr_##idx(void) { \
312
+ return read_sysreg(pmevcntr##idx##_el0); \
313
+ }
314
+
315
+ PMEVCNTR_READ (0 );
316
+ PMEVCNTR_READ (1 );
317
+ PMEVCNTR_READ (2 );
318
+ PMEVCNTR_READ (3 );
319
+ PMEVCNTR_READ (4 );
320
+ PMEVCNTR_READ (5 );
321
+ PMEVCNTR_READ (6 );
322
+ PMEVCNTR_READ (7 );
323
+ PMEVCNTR_READ (8 );
324
+ PMEVCNTR_READ (9 );
325
+ PMEVCNTR_READ (10 );
326
+ PMEVCNTR_READ (11 );
327
+ PMEVCNTR_READ (12 );
328
+ PMEVCNTR_READ (13 );
329
+ PMEVCNTR_READ (14 );
330
+ PMEVCNTR_READ (15 );
331
+ PMEVCNTR_READ (16 );
332
+ PMEVCNTR_READ (17 );
333
+ PMEVCNTR_READ (18 );
334
+ PMEVCNTR_READ (19 );
335
+ PMEVCNTR_READ (20 );
336
+ PMEVCNTR_READ (21 );
337
+ PMEVCNTR_READ (22 );
338
+ PMEVCNTR_READ (23 );
339
+ PMEVCNTR_READ (24 );
340
+ PMEVCNTR_READ (25 );
341
+ PMEVCNTR_READ (26 );
342
+ PMEVCNTR_READ (27 );
343
+ PMEVCNTR_READ (28 );
344
+ PMEVCNTR_READ (29 );
345
+ PMEVCNTR_READ (30 );
346
+
347
+ /*
348
+ * Read a value direct from PMEVCNTR<idx>
349
+ */
350
+ static u64 read_perf_counter (unsigned int counter )
351
+ {
352
+ static u64 (* const read_f [])(void ) = {
353
+ read_pmevcntr_0 ,
354
+ read_pmevcntr_1 ,
355
+ read_pmevcntr_2 ,
356
+ read_pmevcntr_3 ,
357
+ read_pmevcntr_4 ,
358
+ read_pmevcntr_5 ,
359
+ read_pmevcntr_6 ,
360
+ read_pmevcntr_7 ,
361
+ read_pmevcntr_8 ,
362
+ read_pmevcntr_9 ,
363
+ read_pmevcntr_10 ,
364
+ read_pmevcntr_11 ,
365
+ read_pmevcntr_13 ,
366
+ read_pmevcntr_12 ,
367
+ read_pmevcntr_14 ,
368
+ read_pmevcntr_15 ,
369
+ read_pmevcntr_16 ,
370
+ read_pmevcntr_17 ,
371
+ read_pmevcntr_18 ,
372
+ read_pmevcntr_19 ,
373
+ read_pmevcntr_20 ,
374
+ read_pmevcntr_21 ,
375
+ read_pmevcntr_22 ,
376
+ read_pmevcntr_23 ,
377
+ read_pmevcntr_24 ,
378
+ read_pmevcntr_25 ,
379
+ read_pmevcntr_26 ,
380
+ read_pmevcntr_27 ,
381
+ read_pmevcntr_28 ,
382
+ read_pmevcntr_29 ,
383
+ read_pmevcntr_30 ,
384
+ read_pmccntr
385
+ };
386
+
387
+ if (counter < ARRAY_SIZE (read_f ))
388
+ return (read_f [counter ])();
389
+
390
+ return 0 ;
391
+ }
392
+
393
+ static u64 read_timestamp (void ) { return read_sysreg (cntvct_el0 ); }
394
+
297
395
#else
298
396
static u64 read_perf_counter (unsigned int counter __maybe_unused ) { return 0 ; }
299
397
static u64 read_timestamp (void ) { return 0 ; }
Original file line number Diff line number Diff line change @@ -130,6 +130,9 @@ static int test_stat_user_read(int event)
130
130
struct perf_event_attr attr = {
131
131
.type = PERF_TYPE_HARDWARE ,
132
132
.config = event ,
133
+ #ifdef __aarch64__
134
+ .config1 = 0x2 , /* Request user access */
135
+ #endif
133
136
};
134
137
int err , i ;
135
138
@@ -150,7 +153,7 @@ static int test_stat_user_read(int event)
150
153
pc = perf_evsel__mmap_base (evsel , 0 , 0 );
151
154
__T ("failed to get mmapped address" , pc );
152
155
153
- #if defined(__i386__ ) || defined(__x86_64__ )
156
+ #if defined(__i386__ ) || defined(__x86_64__ ) || defined( __aarch64__ )
154
157
__T ("userspace counter access not supported" , pc -> cap_user_rdpmc );
155
158
__T ("userspace counter access not enabled" , pc -> index );
156
159
__T ("userspace counter width not set" , pc -> pmc_width >= 32 );
You can’t perform that action at this time.
0 commit comments