On Fri, Nov 08, 2024 at 08:20:44PM +0100, Peter Zijlstra wrote:
Isn't the below more or less what you want?
static unsigned long misc_flags(struct pt_regs *regs)
{
unsigned long flags = 0;
if (regs->flags & PERF_EFLAGS_EXACT)
flags |= PERF_RECORD_MISC_EXACT_IP;
return flags;
}
static unsigned long native_flags(struct pt_regs *regs)
{
unsigned long flags = 0;
if (user_mode(regs))
flags |= PERF_RECORD_MISC_USER;
else
flags |= PERF_RECORD_MISC_KERNEL;
return flags;
}
static unsigned long guest_flags(struct pt_regs *regs)
{
unsigned long guest_state = perf_guest_state();
unsigned long flags = 0;
if (guest_state & PERF_GUEST_ACTIVE) {
if (guest_state & PERF_GUEST_USER)
flags |= PERF_RECORD_MISC_GUEST_USER;
else
flags |= PERF_RECORD_MISC_GUEST_KERNEL;
}
return flags;
}
unsigned long perf_arch_guest_misc_flags(struct pt_regs *regs)
{
unsigned long flags;
flags = misc_flags(regs);
flags |= guest_flags(regs);
return flags;
}
unsigned long perf_arch_misc_flags(struct pt_regs *regs)
{
unsigned long flags;
unsigned long guest;
flags = misc_flags(regs);
guest = guest_flags(regs);
if (guest)
flags |= guest;
else
flags |= native_flags(regs);
return flags;
}
This last can be written more concise:
unsigned long perf_arch_misc_flags(struct pt_regs *regs)
{
unsigned long flags;
flags = guest_flags(regs);
if (!flags)
flags |= native_flags(regs);
flgs |= misc_flags(regs);
return flags;
}