#define rm_is_mem(reg) (mod_is_mem() && !is_RIP() && rm_is(reg))
 #define rm_is_reg(reg) (mod_is_reg() && modrm_rm == (reg))
 
+static bool has_notrack_prefix(struct insn *insn)
+{
+       int i;
+
+       for (i = 0; i < insn->prefixes.nbytes; i++) {
+               if (insn->prefixes.bytes[i] == 0x3e)
+                       return true;
+       }
+
+       return false;
+}
+
 int arch_decode_instruction(struct objtool_file *file, const struct section *sec,
                            unsigned long offset, unsigned int maxlen,
                            unsigned int *len, enum insn_type *type,
        const struct elf *elf = file->elf;
        struct insn insn;
        int x86_64, ret;
-       unsigned char op1, op2, op3,
+       unsigned char op1, op2, op3, prefix,
                      rex = 0, rex_b = 0, rex_r = 0, rex_w = 0, rex_x = 0,
                      modrm = 0, modrm_mod = 0, modrm_rm = 0, modrm_reg = 0,
                      sib = 0, /* sib_scale = 0, */ sib_index = 0, sib_base = 0;
        if (insn.vex_prefix.nbytes)
                return 0;
 
+       prefix = insn.prefixes.bytes[0];
+
        op1 = insn.opcode.bytes[0];
        op2 = insn.opcode.bytes[1];
        op3 = insn.opcode.bytes[2];
                        /* nopl/nopw */
                        *type = INSN_NOP;
 
+               } else if (op2 == 0x1e) {
+
+                       if (prefix == 0xf3 && (modrm == 0xfa || modrm == 0xfb))
+                               *type = INSN_ENDBR;
+
+
                } else if (op2 == 0x38 && op3 == 0xf8) {
                        if (insn.prefixes.nbytes == 1 &&
                            insn.prefixes.bytes[0] == 0xf2) {
                break;
 
        case 0xff:
-               if (modrm_reg == 2 || modrm_reg == 3)
+               if (modrm_reg == 2 || modrm_reg == 3) {
 
                        *type = INSN_CALL_DYNAMIC;
+                       if (has_notrack_prefix(&insn))
+                               WARN("notrack prefix found at %s:0x%lx", sec->name, offset);
 
-               else if (modrm_reg == 4)
+               } else if (modrm_reg == 4) {
 
                        *type = INSN_JUMP_DYNAMIC;
+                       if (has_notrack_prefix(&insn))
+                               WARN("notrack prefix found at %s:0x%lx", sec->name, offset);
 
-               else if (modrm_reg == 5)
+               } else if (modrm_reg == 5) {
 
                        /* jmpf */
                        *type = INSN_CONTEXT_SWITCH;
 
-               else if (modrm_reg == 6) {
+               } else if (modrm_reg == 6) {
 
                        /* push from mem */
                        ADD_OP(op) {