X86: Implement the LIDT instruction.
authorGabe Black <gblack@eecs.umich.edu>
Sun, 2 Dec 2007 07:01:31 +0000 (23:01 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Sun, 2 Dec 2007 07:01:31 +0000 (23:01 -0800)
--HG--
extra : convert_revision : 380515e985318311632e00b13000585afb052e3b

src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/arch/x86/isa/insts/system/segmentation.py

index ecd575a5d060b0d9e83751d9f58e2ec97f4299f3..717a8f26fa22c79d58e08b222ad60a980cdd2a21 100644 (file)
                                 default: Inst::LGDT(M);
                             }
                         }
-                        0x3: lidt_Ms();
+                        0x3: decode MODE_SUBMODE {
+                            0x0: Inst::LIDT(M);
+                            default: decode OPSIZE {
+                                // 16 bit operand sizes are special, but only
+                                // in legacy and compatability modes.
+                                0x2: Inst::LIDT_16(M);
+                                default: Inst::LIDT(M);
+                            }
+                        }
                         0x4: smsw_Mw();
                         0x6: lmsw_Mw();
                         0x7: invlpg_M();
index 6067f64a049d600e35cb6dfb102d878c91235080..e46941e53a389e6619a73e0945a9e10f68d65537 100644 (file)
@@ -110,4 +110,61 @@ def macroop LGDT_16_P
     wrbase gdtr, t2
     wrlimit gdtr, t1
 };
+
+def macroop LIDT_M
+{
+    .adjust_env oszForPseudoDesc
+
+    # Get the limit
+    ld t1, seg, sib, disp, dataSize=2
+    # Get the base
+    ld t2, seg, sib, 'adjustedDisp + 2'
+    wrbase idtr, t2
+    wrlimit idtr, t1
+};
+
+def macroop LIDT_P
+{
+    .adjust_env oszForPseudoDesc
+
+    rdip t7
+    # Get the limit
+    ld t1, seg, riprel, disp, dataSize=2
+    # Get the base
+    ld t2, seg, riprel, 'adjustedDisp + 2'
+    wrbase idtr, t2
+    wrlimit idtr, t1
+};
+
+#
+# These versions are for when the original data size was 16 bits. The base is
+# still 32 bits, but the top byte is zeroed before being used.
+#
+
+def macroop LIDT_16_M
+{
+    .adjust_env oszForPseudoDesc
+
+    # Get the limit
+    ld t1, seg, sib, disp, dataSize=2
+    # Get the base
+    ld t2, seg, sib, 'adjustedDisp + 2', dataSize=4
+    zexti t2, t2, 23
+    wrbase idtr, t2
+    wrlimit idtr, t1
+};
+
+def macroop LIDT_16_P
+{
+    .adjust_env oszForPseudoDesc
+
+    rdip t7
+    # Get the limit
+    ld t1, seg, riprel, disp, dataSize=2
+    # Get the base
+    ld t2, seg, riprel, 'adjustedDisp + 2', dataSize=4
+    zexti t2, t2, 23
+    wrbase idtr, t2
+    wrlimit idtr, t1
+};
 '''