diff options
| author | iximeow <me@iximeow.net> | 2026-04-12 01:03:47 +0000 |
|---|---|---|
| committer | iximeow <me@iximeow.net> | 2026-05-25 00:59:27 +0000 |
| commit | a049351c5d512710f557ffb45ee6391fc86a3dc6 (patch) | |
| tree | 17040c4c95f9361de271fb1ad874c3a71d2b0e9d /test | |
| parent | 6c32405ca9930f393d8ca45d22df1b5a1c7c8653 (diff) | |
fix table management instructions' ({l,s}{g,i,l}dt) mem_size
these instructions, it turns out, have fixed operand size based on CPU
execution mode and regardless of prefixes. good to know!
Diffstat (limited to 'test')
| -rw-r--r-- | test/long_mode/mod.rs | 10 | ||||
| -rw-r--r-- | test/long_mode/operand.rs | 8 | ||||
| -rw-r--r-- | test/protected_mode/mod.rs | 10 | ||||
| -rw-r--r-- | test/real_mode/mod.rs | 10 |
4 files changed, 23 insertions, 15 deletions
diff --git a/test/long_mode/mod.rs b/test/long_mode/mod.rs index dc82cd4..0b6dcc6 100644 --- a/test/long_mode/mod.rs +++ b/test/long_mode/mod.rs @@ -955,11 +955,11 @@ fn test_0f01() { } test_display(&[0x0f, 0x01, 0x38], "invlpg byte [rax]"); test_display(&[0x0f, 0x01, 0x3f], "invlpg byte [rdi]"); - test_display(&[0x0f, 0x01, 0x40, 0xff], "sgdt ptr [rax - 0x1]"); - test_display(&[0x0f, 0x01, 0x41, 0xff], "sgdt ptr [rcx - 0x1]"); - test_display(&[0x0f, 0x01, 0x49, 0xff], "sidt ptr [rcx - 0x1]"); - test_display(&[0x0f, 0x01, 0x51, 0xff], "lgdt ptr [rcx - 0x1]"); - test_display(&[0x0f, 0x01, 0x59, 0xff], "lidt ptr [rcx - 0x1]"); + test_display(&[0x0f, 0x01, 0x40, 0xff], "sgdt mword [rax - 0x1]"); + test_display(&[0x0f, 0x01, 0x41, 0xff], "sgdt mword [rcx - 0x1]"); + test_display(&[0x0f, 0x01, 0x49, 0xff], "sidt mword [rcx - 0x1]"); + test_display(&[0x0f, 0x01, 0x51, 0xff], "lgdt mword [rcx - 0x1]"); + test_display(&[0x0f, 0x01, 0x59, 0xff], "lidt mword [rcx - 0x1]"); test_display(&[0x0f, 0x01, 0x61, 0xff], "smsw word [rcx - 0x1]"); test_invalid(&[0x0f, 0x01, 0x69, 0xff]); test_display(&[0x0f, 0x01, 0x71, 0xff], "lmsw word [rcx - 0x1]"); diff --git a/test/long_mode/operand.rs b/test/long_mode/operand.rs index 09ac5a2..9f594b5 100644 --- a/test/long_mode/operand.rs +++ b/test/long_mode/operand.rs @@ -69,4 +69,12 @@ fn test_implied_memory_width() { assert_eq!(mem_size_of(&[0x0f, 0xa8]), Some(8)); // pop gs assert_eq!(mem_size_of(&[0x0f, 0xa9]), Some(8)); + // lidt + assert_eq!(mem_size_of(&[0x0f, 0x01, 0x18]), Some(10)); + // sidt + assert_eq!(mem_size_of(&[0x0f, 0x01, 0x08]), Some(10)); + // lgdt + assert_eq!(mem_size_of(&[0x0f, 0x01, 0x10]), Some(10)); + // sgdt + assert_eq!(mem_size_of(&[0x0f, 0x01, 0x00]), Some(10)); } diff --git a/test/protected_mode/mod.rs b/test/protected_mode/mod.rs index 78a061a..d5533cc 100644 --- a/test/protected_mode/mod.rs +++ b/test/protected_mode/mod.rs @@ -811,11 +811,11 @@ fn test_0f01() { // Number" test_display(&[0x0f, 0x01, 0x38], "invlpg byte [eax]"); test_display(&[0x0f, 0x01, 0x3f], "invlpg byte [edi]"); - test_display(&[0x0f, 0x01, 0x40, 0xff], "sgdt ptr [eax - 0x1]"); - test_display(&[0x0f, 0x01, 0x41, 0xff], "sgdt ptr [ecx - 0x1]"); - test_display(&[0x0f, 0x01, 0x49, 0xff], "sidt ptr [ecx - 0x1]"); - test_display(&[0x0f, 0x01, 0x51, 0xff], "lgdt ptr [ecx - 0x1]"); - test_display(&[0x0f, 0x01, 0x59, 0xff], "lidt ptr [ecx - 0x1]"); + test_display(&[0x0f, 0x01, 0x40, 0xff], "sgdt far [eax - 0x1]"); + test_display(&[0x0f, 0x01, 0x41, 0xff], "sgdt far [ecx - 0x1]"); + test_display(&[0x0f, 0x01, 0x49, 0xff], "sidt far [ecx - 0x1]"); + test_display(&[0x0f, 0x01, 0x51, 0xff], "lgdt far [ecx - 0x1]"); + test_display(&[0x0f, 0x01, 0x59, 0xff], "lidt far [ecx - 0x1]"); test_display(&[0x0f, 0x01, 0x61, 0xff], "smsw word [ecx - 0x1]"); test_invalid(&[0x0f, 0x01, 0x69, 0xff]); test_display(&[0x0f, 0x01, 0x71, 0xff], "lmsw word [ecx - 0x1]"); diff --git a/test/real_mode/mod.rs b/test/real_mode/mod.rs index 5fb109f..af8bfaf 100644 --- a/test/real_mode/mod.rs +++ b/test/real_mode/mod.rs @@ -104,11 +104,11 @@ fn test_real_mode() { test_display(&[0x0e], "push cs"); test_display(&[0x0f, 0x01, 0x38], "invlpg byte [bx + si * 1]"); test_display(&[0x0f, 0x01, 0x3f], "invlpg byte [bx]"); - test_display(&[0x0f, 0x01, 0x40, 0xff], "sgdt ptr [bx + si * 1 - 0x1]"); - test_display(&[0x0f, 0x01, 0x41, 0xff], "sgdt ptr [bx + di * 1 - 0x1]"); - test_display(&[0x0f, 0x01, 0x49, 0xff], "sidt ptr [bx + di * 1 - 0x1]"); - test_display(&[0x0f, 0x01, 0x51, 0xff], "lgdt ptr [bx + di * 1 - 0x1]"); - test_display(&[0x0f, 0x01, 0x59, 0xff], "lidt ptr [bx + di * 1 - 0x1]"); + test_display(&[0x0f, 0x01, 0x40, 0xff], "sgdt far [bx + si * 1 - 0x1]"); + test_display(&[0x0f, 0x01, 0x41, 0xff], "sgdt far [bx + di * 1 - 0x1]"); + test_display(&[0x0f, 0x01, 0x49, 0xff], "sidt far [bx + di * 1 - 0x1]"); + test_display(&[0x0f, 0x01, 0x51, 0xff], "lgdt far [bx + di * 1 - 0x1]"); + test_display(&[0x0f, 0x01, 0x59, 0xff], "lidt far [bx + di * 1 - 0x1]"); test_display(&[0x0f, 0x01, 0x61, 0xff], "smsw word [bx + di * 1 - 0x1]"); test_display(&[0x0f, 0x01, 0x71, 0xff], "lmsw word [bx + di * 1 - 0x1]"); test_display(&[0x0f, 0x01, 0x79, 0xff], "invlpg byte [bx + di * 1 - 0x1]"); |
