This expands generic branch type classification by adding two more entries there in i.e irq and exception return. Also updates the x86 implementation to process X86_BR_IRET and X86_BR_IRQ records as appropriate. This changes branch types reported to user space on x86 platform but it should not be a problem. The possible scenarios and impacts are enumerated here.
Unified · Split
| @@ -1329,10 +1329,10 @@ static int branch_map[X86_BR_TYPE_MAP_MAX] = { · 1328 unmodified lines | ||
| 1329 | 1329 | PERF_BR_SYSCALL, /* X86_BR_SYSCALL */ |
| 1330 | 1330 | PERF_BR_SYSRET, /* X86_BR_SYSRET */ |
| 1331 | 1331 | PERF_BR_UNKNOWN, /* X86_BR_INT */ |
| 1332 | − PERF_BR_UNKNOWN, /* X86_BR_IRET */ | |
| 1332 | + PERF_BR_ERET, /* X86_BR_IRET */ | |
| 1333 | 1333 | PERF_BR_COND, /* X86_BR_JCC */ |
| 1334 | 1334 | PERF_BR_UNCOND, /* X86_BR_JMP */ |
| 1335 | − PERF_BR_UNKNOWN, /* X86_BR_IRQ */ | |
| 1335 | + PERF_BR_IRQ, /* X86_BR_IRQ */ | |
| 1336 | 1336 | PERF_BR_IND_CALL, /* X86_BR_IND_CALL */ |
| 1337 | 1337 | PERF_BR_UNKNOWN, /* X86_BR_ABORT */ |
| 1338 | 1338 | PERF_BR_UNKNOWN, /* X86_BR_IN_TX */ |
| @@ -251,6 +251,8 @@ enum { · 250 unmodified lines | ||
| 251 | 251 | PERF_BR_SYSRET = 8, /* syscall return */ |
| 252 | 252 | PERF_BR_COND_CALL = 9, /* conditional function call */ |
| 253 | 253 | PERF_BR_COND_RET = 10, /* conditional function return */ |
| 254 | + PERF_BR_ERET = 11, /* exception return */ | |
| 255 | + PERF_BR_IRQ = 12, /* irq */ | |
| 254 | 256 | PERF_BR_MAX, |
| 255 | 257 | }; |
| 256 | 258 | |
| @@ -251,6 +251,8 @@ enum { · 250 unmodified lines | ||
| 251 | 251 | PERF_BR_SYSRET = 8, /* syscall return */ |
| 252 | 252 | PERF_BR_COND_CALL = 9, /* conditional function call */ |
| 253 | 253 | PERF_BR_COND_RET = 10, /* conditional function return */ |
| 254 | + PERF_BR_ERET = 11, /* exception return */ | |
| 255 | + PERF_BR_IRQ = 12, /* irq */ | |
| 254 | 256 | PERF_BR_MAX, |
| 255 | 257 | }; |
| 256 | 258 | |
| @@ -49,7 +49,9 @@ const char *branch_type_name(int type) · 48 unmodified lines | ||
| 49 | 49 | "SYSCALL", |
| 50 | 50 | "SYSRET", |
| 51 | 51 | "COND_CALL", |
| 52 | − "COND_RET" | |
| 52 | + "COND_RET", | |
| 53 | + "ERET", | |
| 54 | + "IRQ" | |
| 53 | 55 | }; |
| 54 | 56 | |
| 55 | 57 | if (type >= 0 && type < PERF_BR_MAX) |