|
@@ -94,7 +94,8 @@ enum {
|
|
|
X86_BR_ABORT = 1 << 12,/* transaction abort */
|
|
|
X86_BR_IN_TX = 1 << 13,/* in transaction */
|
|
|
X86_BR_NO_TX = 1 << 14,/* not in transaction */
|
|
|
- X86_BR_CALL_STACK = 1 << 15,/* call stack */
|
|
|
+ X86_BR_ZERO_CALL = 1 << 15,/* zero length call */
|
|
|
+ X86_BR_CALL_STACK = 1 << 16,/* call stack */
|
|
|
};
|
|
|
|
|
|
#define X86_BR_PLM (X86_BR_USER | X86_BR_KERNEL)
|
|
@@ -111,13 +112,15 @@ enum {
|
|
|
X86_BR_JMP |\
|
|
|
X86_BR_IRQ |\
|
|
|
X86_BR_ABORT |\
|
|
|
- X86_BR_IND_CALL)
|
|
|
+ X86_BR_IND_CALL |\
|
|
|
+ X86_BR_ZERO_CALL)
|
|
|
|
|
|
#define X86_BR_ALL (X86_BR_PLM | X86_BR_ANY)
|
|
|
|
|
|
#define X86_BR_ANY_CALL \
|
|
|
(X86_BR_CALL |\
|
|
|
X86_BR_IND_CALL |\
|
|
|
+ X86_BR_ZERO_CALL |\
|
|
|
X86_BR_SYSCALL |\
|
|
|
X86_BR_IRQ |\
|
|
|
X86_BR_INT)
|
|
@@ -702,6 +705,12 @@ static int branch_type(unsigned long from, unsigned long to, int abort)
|
|
|
ret = X86_BR_INT;
|
|
|
break;
|
|
|
case 0xe8: /* call near rel */
|
|
|
+ insn_get_immediate(&insn);
|
|
|
+ if (insn.immediate1.value == 0) {
|
|
|
+ /* zero length call */
|
|
|
+ ret = X86_BR_ZERO_CALL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
case 0x9a: /* call far absolute */
|
|
|
ret = X86_BR_CALL;
|
|
|
break;
|