X86: Implement the lldt instruction.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 25 Feb 2009 18:21:27 +0000 (10:21 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 25 Feb 2009 18:21:27 +0000 (10:21 -0800)
src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/arch/x86/isa/insts/system/segmentation.py

index c127ff458093023fec2af148b4226ce30e4f9d24..9c376e2c4ed233061e3b53ff16a2873b7929bc89 100644 (file)
@@ -93,7 +93,7 @@
                 0x00: decode MODRM_REG {
                     0x0: sldt_Mw_or_Rv();
                     0x1: str_Mw_or_Rv();
-                    0x2: lldt_Mw_or_Rv();
+                    0x2: Inst::LLDT(Ew);
                     0x3: Inst::LTR(Ew);
                     0x4: verr_Mw_or_Rv();
                     0x5: verw_Mw_or_Rv();
index 7c13765ca31a927010208263abdf1a6934e26ad7..acbca9f6e698aaafdd8fb61f2535a155783a25d9 100644 (file)
@@ -216,6 +216,57 @@ def macroop LTR_P
     st t1, tsg, [8, t4, t0], dataSize=8
 };
 
+def macroop LLDT_R
+{
+    chks reg, t0, InGDTCheck, flags=(EZF,)
+    br label("end"), flags=(CEZF,)
+    limm t4, 0
+    srli t4, reg, 3, dataSize=2
+    ldst t1, tsg, [8, t4, t0], dataSize=8
+    ld t2, tsg, [8, t4, t0], 8, dataSize=8
+    chks reg, t1, LDTCheck
+    wrdh t3, t1, t2
+    wrdl tr, t1, reg
+    wrbase tr, t3, dataSize=8
+end:
+    fault "NoFault"
+};
+
+def macroop LLDT_M
+{
+    ld t5, seg, sib, disp, dataSize=2
+    chks t5, t0, InGDTCheck, flags=(EZF,)
+    br label("end"), flags=(CEZF,)
+    limm t4, 0
+    srli t4, t5, 3, dataSize=2
+    ldst t1, tsg, [8, t4, t0], dataSize=8
+    ld t2, tsg, [8, t4, t0], 8, dataSize=8
+    chks t5, t1, LDTCheck
+    wrdh t3, t1, t2
+    wrdl tr, t1, t5
+    wrbase tr, t3, dataSize=8
+end:
+    fault "NoFault"
+};
+
+def macroop LLDT_P
+{
+    rdip t7
+    ld t5, seg, riprel, disp, dataSize=2
+    chks t5, t0, InGDTCheck, flags=(EZF,)
+    br label("end"), flags=(CEZF,)
+    limm t4, 0
+    srli t4, t5, 3, dataSize=2
+    ldst t1, tsg, [8, t4, t0], dataSize=8
+    ld t2, tsg, [8, t4, t0], 8, dataSize=8
+    chks t5, t1, LDTCheck
+    wrdh t3, t1, t2
+    wrdl tr, t1, t5
+    wrbase tr, t3, dataSize=8
+end:
+    fault "NoFault"
+};
+
 def macroop SWAPGS
 {
     rdval t1, kernel_gs_base, dataSize=8