Skip to content

Commit c66f877

Browse files
authored
Update read/written registers for x86 interrupt instructions (#2781)
1 parent 6bffa38 commit c66f877

File tree

5 files changed

+171
-16
lines changed

5 files changed

+171
-16
lines changed

arch/X86/X86MappingInsn.inc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6278,28 +6278,28 @@
62786278
{
62796279
X86_INT, X86_INS_INT, 0,
62806280
#ifndef CAPSTONE_DIET
6281-
{ 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
6281+
{ X86_REG_EFLAGS, X86_REG_ESP, 0 }, { X86_REG_EFLAGS, X86_REG_EIP, X86_REG_ESP, 0 }, { X86_GRP_INT, 0 }, 0, 0
62826282
#endif
62836283
},
62846284

62856285
{
62866286
X86_INT1, X86_INS_INT1, 0,
62876287
#ifndef CAPSTONE_DIET
6288-
{ 0 }, { X86_REG_EFLAGS, 0 }, { X86_GRP_INT, 0 }, 0, 0
6288+
{ X86_REG_ESP, 0 }, { X86_REG_EIP, X86_REG_ESP, 0 }, { X86_GRP_INT, 0 }, 0, 0
62896289
#endif
62906290
},
62916291

62926292
{
62936293
X86_INT3, X86_INS_INT3, 0,
62946294
#ifndef CAPSTONE_DIET
6295-
{ 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
6295+
{ X86_REG_EFLAGS, X86_REG_ESP, 0 }, { X86_REG_EFLAGS, X86_REG_EIP, X86_REG_ESP, 0 }, { X86_GRP_INT, 0 }, 0, 0
62966296
#endif
62976297
},
62986298

62996299
{
63006300
X86_INTO, X86_INS_INTO, 0,
63016301
#ifndef CAPSTONE_DIET
6302-
{ X86_REG_EFLAGS, 0 }, { 0 }, { X86_GRP_INT, X86_GRP_NOT64BITMODE, 0 }, 0, 0
6302+
{ X86_REG_EFLAGS, X86_REG_ESP, 0 }, { X86_REG_EFLAGS, X86_REG_EIP, X86_REG_ESP, 0 }, { X86_GRP_INT, X86_GRP_NOT64BITMODE, 0 }, 0, 0
63036303
#endif
63046304
},
63056305

arch/X86/X86MappingInsnOp.inc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4484,22 +4484,22 @@
44844484
},
44854485

44864486
{ /* X86_INT, X86_INS_INT: int */
4487-
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_MODIFY_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_MODIFY_RF,
4487+
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_RESET_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_RESET_RF,
44884488
{ CS_AC_IGNORE, 0 }
44894489
},
44904490

44914491
{ /* X86_INT1, X86_INS_INT1: int1 */
4492-
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_MODIFY_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_MODIFY_RF,
4492+
0,
44934493
{ 0 }
44944494
},
44954495

44964496
{ /* X86_INT3, X86_INS_INT3: int3 */
4497-
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_MODIFY_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_MODIFY_RF,
4497+
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_RESET_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_RESET_RF,
44984498
{ 0 }
44994499
},
45004500

45014501
{ /* X86_INTO, X86_INS_INTO: into */
4502-
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_MODIFY_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_MODIFY_RF,
4502+
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_MODIFY_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_RESET_RF | X86_EFLAGS_TEST_OF,
45034503
{ 0 }
45044504
},
45054505

arch/X86/X86MappingInsnOp_reduce.inc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2579,22 +2579,22 @@
25792579
},
25802580

25812581
{ /* X86_INT, X86_INS_INT: int */
2582-
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_MODIFY_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_MODIFY_RF,
2582+
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_RESET_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_RESET_RF,
25832583
{ CS_AC_IGNORE, 0 }
25842584
},
25852585

25862586
{ /* X86_INT1, X86_INS_INT1: int1 */
2587-
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_MODIFY_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_MODIFY_RF,
2587+
0,
25882588
{ 0 }
25892589
},
25902590

25912591
{ /* X86_INT3, X86_INS_INT3: int3 */
2592-
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_MODIFY_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_MODIFY_RF,
2592+
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_RESET_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_RESET_RF,
25932593
{ 0 }
25942594
},
25952595

25962596
{ /* X86_INTO, X86_INS_INTO: into */
2597-
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_MODIFY_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_MODIFY_RF,
2597+
X86_EFLAGS_MODIFY_IF | X86_EFLAGS_MODIFY_TF | X86_EFLAGS_MODIFY_NT | X86_EFLAGS_RESET_RF | X86_EFLAGS_TEST_OF,
25982598
{ 0 }
25992599
},
26002600

arch/X86/X86MappingInsn_reduce.inc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3611,28 +3611,28 @@
36113611
{
36123612
X86_INT, X86_INS_INT, 0,
36133613
#ifndef CAPSTONE_DIET
3614-
{ 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
3614+
{ X86_REG_EFLAGS, X86_REG_ESP, 0 }, { X86_REG_EFLAGS, X86_REG_EIP, X86_REG_ESP, 0 }, { X86_GRP_INT, 0 }, 0, 0
36153615
#endif
36163616
},
36173617

36183618
{
36193619
X86_INT1, X86_INS_INT1, 0,
36203620
#ifndef CAPSTONE_DIET
3621-
{ 0 }, { X86_REG_EFLAGS, 0 }, { X86_GRP_INT, 0 }, 0, 0
3621+
{ X86_REG_ESP, 0 }, { X86_REG_EIP, X86_REG_ESP, 0 }, { X86_GRP_INT, 0 }, 0, 0
36223622
#endif
36233623
},
36243624

36253625
{
36263626
X86_INT3, X86_INS_INT3, 0,
36273627
#ifndef CAPSTONE_DIET
3628-
{ 0 }, { 0 }, { X86_GRP_INT, 0 }, 0, 0
3628+
{ X86_REG_EFLAGS, X86_REG_ESP, 0 }, { X86_REG_EFLAGS, X86_REG_EIP, X86_REG_ESP, 0 }, { X86_GRP_INT, 0 }, 0, 0
36293629
#endif
36303630
},
36313631

36323632
{
36333633
X86_INTO, X86_INS_INTO, 0,
36343634
#ifndef CAPSTONE_DIET
3635-
{ X86_REG_EFLAGS, 0 }, { 0 }, { X86_GRP_INT, X86_GRP_NOT64BITMODE, 0 }, 0, 0
3635+
{ X86_REG_EFLAGS, X86_REG_ESP, 0 }, { X86_REG_EFLAGS, X86_REG_EIP, X86_REG_ESP, 0 }, { X86_GRP_INT, X86_GRP_NOT64BITMODE, 0 }, 0, 0
36363636
#endif
36373637
},
36383638

tests/details/x86.yaml

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2360,3 +2360,158 @@ test_cases:
23602360
access: CS_AC_READ
23612361
regs_read: [ esp, eip, gs, rip]
23622362
regs_write: [ esp, eip ]
2363+
2364+
-
2365+
input:
2366+
name: "Interrupt instructions, 16-bit decode mode"
2367+
bytes: [
2368+
0xcc, # int3
2369+
0xcd, 0x80, # int 0x80
2370+
0xce, # into
2371+
0xf1 # int1
2372+
]
2373+
arch: "x86"
2374+
options: [ CS_OPT_DETAIL, CS_MODE_16 ]
2375+
address: 0x0
2376+
expected:
2377+
insns:
2378+
-
2379+
asm_text: "int3"
2380+
details:
2381+
x86:
2382+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2383+
opcode: [ 0xcc, 0x00, 0x00, 0x00 ]
2384+
eflags: [ X86_EFLAGS_RESET_TF, X86_EFLAGS_MODIFY_IF, X86_EFLAGS_MODIFY_NT, X86_EFLAGS_RESET_RF ]
2385+
regs_read: [ flags, esp ]
2386+
regs_write: [ flags, eip, esp ]
2387+
-
2388+
asm_text: "int 0x80"
2389+
details:
2390+
x86:
2391+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2392+
opcode: [ 0xcd, 0x00, 0x00, 0x00 ]
2393+
eflags: [ X86_EFLAGS_RESET_TF, X86_EFLAGS_MODIFY_IF, X86_EFLAGS_MODIFY_NT, X86_EFLAGS_RESET_RF ]
2394+
operands:
2395+
-
2396+
type: X86_OP_IMM
2397+
imm: 0x80
2398+
size: 1
2399+
regs_read: [ flags, esp ]
2400+
regs_write: [ flags, eip, esp ]
2401+
-
2402+
asm_text: "into"
2403+
details:
2404+
x86:
2405+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2406+
opcode: [ 0xce, 0x00, 0x00, 0x00 ]
2407+
eflags: [ X86_EFLAGS_MODIFY_TF, X86_EFLAGS_MODIFY_IF, X86_EFLAGS_MODIFY_NT, X86_EFLAGS_RESET_RF, X86_EFLAGS_TEST_OF ]
2408+
regs_read: [ flags, esp ]
2409+
regs_write: [ flags, eip, esp ]
2410+
-
2411+
asm_text: "int1"
2412+
details:
2413+
x86:
2414+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2415+
opcode: [ 0xf1, 0x00, 0x00, 0x00 ]
2416+
regs_read: [ esp ]
2417+
regs_write: [ eip, esp ]
2418+
2419+
-
2420+
input:
2421+
name: "Interrupt instructions, 32-bit decode mode"
2422+
bytes: [
2423+
0xcc, # int3
2424+
0xcd, 0x80, # int 0x80
2425+
0xce, # into
2426+
0xf1 # int1
2427+
]
2428+
arch: "x86"
2429+
options: [ CS_OPT_DETAIL, CS_MODE_32 ]
2430+
address: 0x0
2431+
expected:
2432+
insns:
2433+
-
2434+
asm_text: "int3"
2435+
details:
2436+
x86:
2437+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2438+
opcode: [ 0xcc, 0x00, 0x00, 0x00 ]
2439+
eflags: [ X86_EFLAGS_RESET_TF, X86_EFLAGS_MODIFY_IF, X86_EFLAGS_MODIFY_NT, X86_EFLAGS_RESET_RF ]
2440+
regs_read: [ eflags, esp ]
2441+
regs_write: [ eflags, eip, esp ]
2442+
-
2443+
asm_text: "int 0x80"
2444+
details:
2445+
x86:
2446+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2447+
opcode: [ 0xcd, 0x00, 0x00, 0x00 ]
2448+
eflags: [ X86_EFLAGS_RESET_TF, X86_EFLAGS_MODIFY_IF, X86_EFLAGS_MODIFY_NT, X86_EFLAGS_RESET_RF ]
2449+
operands:
2450+
-
2451+
type: X86_OP_IMM
2452+
imm: 0x80
2453+
size: 1
2454+
regs_read: [ eflags, esp ]
2455+
regs_write: [ eflags, eip, esp ]
2456+
-
2457+
asm_text: "into"
2458+
details:
2459+
x86:
2460+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2461+
opcode: [ 0xce, 0x00, 0x00, 0x00 ]
2462+
eflags: [ X86_EFLAGS_MODIFY_TF, X86_EFLAGS_MODIFY_IF, X86_EFLAGS_MODIFY_NT, X86_EFLAGS_RESET_RF, X86_EFLAGS_TEST_OF ]
2463+
regs_read: [ eflags, esp ]
2464+
regs_write: [ eflags, eip, esp ]
2465+
-
2466+
asm_text: "int1"
2467+
details:
2468+
x86:
2469+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2470+
opcode: [ 0xf1, 0x00, 0x00, 0x00 ]
2471+
regs_read: [ esp ]
2472+
regs_write: [ eip, esp ]
2473+
2474+
-
2475+
input:
2476+
name: "Interrupt instructions, 64-bit decode mode"
2477+
bytes: [
2478+
0xcc, # int3
2479+
0xcd, 0x80, # int 0x80
2480+
0xf1 # int1
2481+
]
2482+
arch: "x86"
2483+
options: [ CS_OPT_DETAIL, CS_MODE_64 ]
2484+
address: 0x0
2485+
expected:
2486+
insns:
2487+
-
2488+
asm_text: "int3"
2489+
details:
2490+
x86:
2491+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2492+
opcode: [ 0xcc, 0x00, 0x00, 0x00 ]
2493+
eflags: [ X86_EFLAGS_RESET_TF, X86_EFLAGS_MODIFY_IF, X86_EFLAGS_MODIFY_NT, X86_EFLAGS_RESET_RF ]
2494+
regs_read: [ rflags, esp ]
2495+
regs_write: [ rflags, eip, esp ]
2496+
-
2497+
asm_text: "int 0x80"
2498+
details:
2499+
x86:
2500+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2501+
opcode: [ 0xcd, 0x00, 0x00, 0x00 ]
2502+
eflags: [ X86_EFLAGS_RESET_TF, X86_EFLAGS_MODIFY_IF, X86_EFLAGS_MODIFY_NT, X86_EFLAGS_RESET_RF ]
2503+
operands:
2504+
-
2505+
type: X86_OP_IMM
2506+
imm: 0x80
2507+
size: 1
2508+
regs_read: [ rflags, esp ]
2509+
regs_write: [ rflags, eip, esp ]
2510+
-
2511+
asm_text: "int1"
2512+
details:
2513+
x86:
2514+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
2515+
opcode: [ 0xf1, 0x00, 0x00, 0x00 ]
2516+
regs_read: [ esp ]
2517+
regs_write: [ eip, esp ]

0 commit comments

Comments
 (0)