aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64/kernel/perf_event.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm64/kernel/perf_event.c')
-rw-r--r--arch/arm64/kernel/perf_event.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index f7073c7b1ca9..1e49e5eb81e9 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -1331,6 +1331,11 @@ void perf_callchain_user(struct perf_callchain_entry *entry,
1331{ 1331{
1332 struct frame_tail __user *tail; 1332 struct frame_tail __user *tail;
1333 1333
1334 if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
1335 /* We don't support guest os callchain now */
1336 return;
1337 }
1338
1334 tail = (struct frame_tail __user *)regs->regs[29]; 1339 tail = (struct frame_tail __user *)regs->regs[29];
1335 1340
1336 while (entry->nr < PERF_MAX_STACK_DEPTH && 1341 while (entry->nr < PERF_MAX_STACK_DEPTH &&
@@ -1355,8 +1360,40 @@ void perf_callchain_kernel(struct perf_callchain_entry *entry,
1355{ 1360{
1356 struct stackframe frame; 1361 struct stackframe frame;
1357 1362
1363 if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
1364 /* We don't support guest os callchain now */
1365 return;
1366 }
1367
1358 frame.fp = regs->regs[29]; 1368 frame.fp = regs->regs[29];
1359 frame.sp = regs->sp; 1369 frame.sp = regs->sp;
1360 frame.pc = regs->pc; 1370 frame.pc = regs->pc;
1361 walk_stackframe(&frame, callchain_trace, entry); 1371 walk_stackframe(&frame, callchain_trace, entry);
1362} 1372}
1373
1374unsigned long perf_instruction_pointer(struct pt_regs *regs)
1375{
1376 if (perf_guest_cbs && perf_guest_cbs->is_in_guest())
1377 return perf_guest_cbs->get_guest_ip();
1378
1379 return instruction_pointer(regs);
1380}
1381
1382unsigned long perf_misc_flags(struct pt_regs *regs)
1383{
1384 int misc = 0;
1385
1386 if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
1387 if (perf_guest_cbs->is_user_mode())
1388 misc |= PERF_RECORD_MISC_GUEST_USER;
1389 else
1390 misc |= PERF_RECORD_MISC_GUEST_KERNEL;
1391 } else {
1392 if (user_mode(regs))
1393 misc |= PERF_RECORD_MISC_USER;
1394 else
1395 misc |= PERF_RECORD_MISC_KERNEL;
1396 }
1397
1398 return misc;
1399}