|
@@ -576,6 +576,10 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs)
|
|
|
{
|
|
|
struct frame_tail __user *tail;
|
|
|
|
|
|
+ if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
|
|
|
+ /* We don't support guest os callchain now */
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
tail = (struct frame_tail __user *)regs->ARM_fp - 1;
|
|
|
|
|
@@ -603,9 +607,41 @@ perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs)
|
|
|
{
|
|
|
struct stackframe fr;
|
|
|
|
|
|
+ if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
|
|
|
+ /* We don't support guest os callchain now */
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
fr.fp = regs->ARM_fp;
|
|
|
fr.sp = regs->ARM_sp;
|
|
|
fr.lr = regs->ARM_lr;
|
|
|
fr.pc = regs->ARM_pc;
|
|
|
walk_stackframe(&fr, callchain_trace, entry);
|
|
|
}
|
|
|
+
|
|
|
+unsigned long perf_instruction_pointer(struct pt_regs *regs)
|
|
|
+{
|
|
|
+ if (perf_guest_cbs && perf_guest_cbs->is_in_guest())
|
|
|
+ return perf_guest_cbs->get_guest_ip();
|
|
|
+
|
|
|
+ return instruction_pointer(regs);
|
|
|
+}
|
|
|
+
|
|
|
+unsigned long perf_misc_flags(struct pt_regs *regs)
|
|
|
+{
|
|
|
+ int misc = 0;
|
|
|
+
|
|
|
+ if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
|
|
|
+ if (perf_guest_cbs->is_user_mode())
|
|
|
+ misc |= PERF_RECORD_MISC_GUEST_USER;
|
|
|
+ else
|
|
|
+ misc |= PERF_RECORD_MISC_GUEST_KERNEL;
|
|
|
+ } else {
|
|
|
+ if (user_mode(regs))
|
|
|
+ misc |= PERF_RECORD_MISC_USER;
|
|
|
+ else
|
|
|
+ misc |= PERF_RECORD_MISC_KERNEL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return misc;
|
|
|
+}
|