diff options
| author | iximeow <me@iximeow.net> | 2026-04-12 01:00:46 +0000 |
|---|---|---|
| committer | iximeow <me@iximeow.net> | 2026-04-12 01:00:46 +0000 |
| commit | 25eabe56e7f567565e6738273fecee4b87204a32 (patch) | |
| tree | 60618ce630dfd7d1f1314ac5557b4925fe24cfe5 /src/long_mode/mod.rs | |
| parent | e6de43ec858d3d4e1219bb4b7426ff344d99dd33 (diff) | |
test table management instructions ({l,s}{g,i,l}dt)
these instructions, it turns out, have fixed operand size based on CPU
execution mode and regardless of prefixes. good to know!
Diffstat (limited to 'src/long_mode/mod.rs')
| -rw-r--r-- | src/long_mode/mod.rs | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs index 117643a..7915dc0 100644 --- a/src/long_mode/mod.rs +++ b/src/long_mode/mod.rs @@ -8246,7 +8246,7 @@ fn read_operands< } else { instruction.opcode = Opcode::SGDT; instruction.operand_count = 1; - instruction.mem_size = 63; + instruction.mem_size = 10; instruction.operands[0] = read_E(words, instruction, modrm, bank, sink)?; } } else if r == 1 { @@ -8301,7 +8301,7 @@ fn read_operands< } else { instruction.opcode = Opcode::SIDT; instruction.operand_count = 1; - instruction.mem_size = 63; + instruction.mem_size = 10; instruction.operands[0] = read_E(words, instruction, modrm, bank, sink)?; } } else if r == 2 { @@ -8340,7 +8340,10 @@ fn read_operands< } else { instruction.opcode = Opcode::LGDT; instruction.operand_count = 1; - instruction.mem_size = 63; + // quoth SDM: + // > In 64-bit mode, the operand size is fixed at 8+2 bytes. The instruction + // > stores an 8-byte base and a 2-byte limit. + instruction.mem_size = 10; instruction.operands[0] = read_E(words, instruction, modrm, bank, sink)?; } } else if r == 3 { @@ -8404,7 +8407,7 @@ fn read_operands< } else { instruction.opcode = Opcode::LIDT; instruction.operand_count = 1; - instruction.mem_size = 63; + instruction.mem_size = 10; instruction.operands[0] = read_E(words, instruction, modrm, bank, sink)?; } } else if r == 4 { |
