X86: Don't use "#if FULL_SYSTEM" in the X86 ISA description.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 19 Sep 2011 09:53:37 +0000 (02:53 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 19 Sep 2011 09:53:37 +0000 (02:53 -0700)
The decoder now checks the value of FULL_SYSTEM in a switch statement to
decide whether to return a real syscall instruction or one that triggers
syscall emulation (or a panic in FS mode). The switch statement should devolve
into an if, and also should be optimized out since it's based on constant
input.

src/arch/x86/isa/decoder/one_byte_opcodes.isa
src/arch/x86/isa/decoder/two_byte_opcodes.isa

index 71d16123196a8d1eca6d66936603ddbe2d1b8b74..4a5cf32d0aa1e2367b36932940b91c2bc9766324 100644 (file)
                     default: Inst::RET_FAR();
                 }
                 0x4: int3();
-#if FULL_SYSTEM
-                0x5: int_Ib();
-#else
-                // Really only the LSB matters, but the predecoder will sign
-                // extend it, and there's no easy way to specify only checking
-                // the first byte.
-                0x5: decode IMMEDIATE {
-                    -0x80:
-                         SyscallInst::int80('xc->syscall(Rax)',
-                                 IsSyscall, IsNonSpeculative, IsSerializeAfter);
-                    default: int_Ib();
+                0x5: decode FULL_SYSTEM default int_Ib() {
+                    0: decode IMMEDIATE {
+                        // Really only the LSB matters, but the predecoder
+                        // will sign extend it, and there's no easy way to
+                        // specify only checking the first byte.
+                        -0x80: SyscallInst::int80('xc->syscall(Rax)',
+                            IsSyscall, IsNonSpeculative, IsSerializeAfter);
+                    }
                 }
-#endif
                 0x6: decode MODE_SUBMODE {
                     0x0: Inst::UD2();
                     default: into();
index e4df4ac661dacd8e02c740aaac09e2a558963898..2471b61ce7f8b8e29fc132c01f0e4db023ac9423 100644 (file)
                         default: Inst::UD2();
                     }
                 }
-#if FULL_SYSTEM
-                0x05: decode MODE_MODE {
-                    0x0: decode MODE_SUBMODE {
-                        0x0: Inst::SYSCALL_64();
-                        0x1: Inst::SYSCALL_COMPAT();
+                0x05: decode FULL_SYSTEM {
+                    0: SyscallInst::syscall('xc->syscall(Rax)',
+                            IsSyscall, IsNonSpeculative, IsSerializeAfter);
+                    default: decode MODE_MODE {
+                        0x0: decode MODE_SUBMODE {
+                            0x0: Inst::SYSCALL_64();
+                            0x1: Inst::SYSCALL_COMPAT();
+                        }
+                        0x1: Inst::SYSCALL_LEGACY();
                     }
-                    0x1: Inst::SYSCALL_LEGACY();
                 }
-#else
-                0x05: SyscallInst::syscall('xc->syscall(Rax)',
-                              IsSyscall, IsNonSpeculative, IsSerializeAfter);
-#endif
                 0x06: Inst::CLTS();
                 0x07: decode MODE_SUBMODE {
                     0x0: decode OPSIZE {
                 0x1: Inst::RDTSC();
                 0x2: Inst::RDMSR();
                 0x3: rdpmc();
-#if FULL_SYSTEM
-                0x4: sysenter();
-#else
-                0x4: SyscallInst::sysenter('xc->syscall(Rax)',
-                             IsSyscall, IsNonSpeculative, IsSerializeAfter);
-#endif
+                0x4: decode FULL_SYSTEM {
+                    0: SyscallInst::sysenter('xc->syscall(Rax)',
+                            IsSyscall, IsNonSpeculative, IsSerializeAfter);
+                    default: sysenter();
+                }
                 0x5: sysexit();
                 0x6: Inst::UD2();
                 0x7: getsec();