PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT       = 14, /* no flags */
        PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT      = 15, /* no cycles */
 
+       PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT      = 16, /* save branch type */
+
        PERF_SAMPLE_BRANCH_MAX_SHIFT            /* non-ABI */
 };
 
        PERF_SAMPLE_BRANCH_NO_FLAGS     = 1U << PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT,
        PERF_SAMPLE_BRANCH_NO_CYCLES    = 1U << PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT,
 
+       PERF_SAMPLE_BRANCH_TYPE_SAVE    =
+               1U << PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT,
+
        PERF_SAMPLE_BRANCH_MAX          = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT,
 };
 
+/*
+ * Common flow change classification
+ */
+enum {
+       PERF_BR_UNKNOWN         = 0,    /* unknown */
+       PERF_BR_COND            = 1,    /* conditional */
+       PERF_BR_UNCOND          = 2,    /* unconditional  */
+       PERF_BR_IND             = 3,    /* indirect */
+       PERF_BR_CALL            = 4,    /* function call */
+       PERF_BR_IND_CALL        = 5,    /* indirect function call */
+       PERF_BR_RET             = 6,    /* function return */
+       PERF_BR_SYSCALL         = 7,    /* syscall */
+       PERF_BR_SYSRET          = 8,    /* syscall return */
+       PERF_BR_COND_CALL       = 9,    /* conditional function call */
+       PERF_BR_COND_RET        = 10,   /* conditional function return */
+       PERF_BR_MAX,
+};
+
 #define PERF_SAMPLE_BRANCH_PLM_ALL \
        (PERF_SAMPLE_BRANCH_USER|\
         PERF_SAMPLE_BRANCH_KERNEL|\
  *     in_tx: running in a hardware transaction
  *     abort: aborting a hardware transaction
  *    cycles: cycles from last branch (or 0 if not supported)
+ *      type: branch type
  */
 struct perf_branch_entry {
        __u64   from;
                in_tx:1,    /* in transaction */
                abort:1,    /* transaction abort */
                cycles:16,  /* cycle count to last branch */
-               reserved:44;
+               type:4,     /* branch type */
+               reserved:40;
 };
 
 #endif /* _UAPI_LINUX_PERF_EVENT_H */
 
        PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT       = 14, /* no flags */
        PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT      = 15, /* no cycles */
 
+       PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT      = 16, /* save branch type */
+
        PERF_SAMPLE_BRANCH_MAX_SHIFT            /* non-ABI */
 };
 
        PERF_SAMPLE_BRANCH_NO_FLAGS     = 1U << PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT,
        PERF_SAMPLE_BRANCH_NO_CYCLES    = 1U << PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT,
 
+       PERF_SAMPLE_BRANCH_TYPE_SAVE    =
+               1U << PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT,
+
        PERF_SAMPLE_BRANCH_MAX          = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT,
 };
 
+/*
+ * Common flow change classification
+ */
+enum {
+       PERF_BR_UNKNOWN         = 0,    /* unknown */
+       PERF_BR_COND            = 1,    /* conditional */
+       PERF_BR_UNCOND          = 2,    /* unconditional  */
+       PERF_BR_IND             = 3,    /* indirect */
+       PERF_BR_CALL            = 4,    /* function call */
+       PERF_BR_IND_CALL        = 5,    /* indirect function call */
+       PERF_BR_RET             = 6,    /* function return */
+       PERF_BR_SYSCALL         = 7,    /* syscall */
+       PERF_BR_SYSRET          = 8,    /* syscall return */
+       PERF_BR_COND_CALL       = 9,    /* conditional function call */
+       PERF_BR_COND_RET        = 10,   /* conditional function return */
+       PERF_BR_MAX,
+};
+
 #define PERF_SAMPLE_BRANCH_PLM_ALL \
        (PERF_SAMPLE_BRANCH_USER|\
         PERF_SAMPLE_BRANCH_KERNEL|\
  *     in_tx: running in a hardware transaction
  *     abort: aborting a hardware transaction
  *    cycles: cycles from last branch (or 0 if not supported)
+ *      type: branch type
  */
 struct perf_branch_entry {
        __u64   from;
                in_tx:1,    /* in transaction */
                abort:1,    /* transaction abort */
                cycles:16,  /* cycle count to last branch */
-               reserved:44;
+               type:4,     /* branch type */
+               reserved:40;
 };
 
 #endif /* _UAPI_LINUX_PERF_EVENT_H */