X86: Don't use "#if FULL_SYSTEM" in the X86 ISA description.
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.
This commit is contained in:
parent
10c2e37f60
commit
7701c5b1ec
|
@ -394,19 +394,15 @@
|
|||
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)',
|
||||
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);
|
||||
default: int_Ib();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
0x6: decode MODE_SUBMODE {
|
||||
0x0: Inst::UD2();
|
||||
default: into();
|
||||
|
|
|
@ -216,18 +216,17 @@
|
|||
default: Inst::UD2();
|
||||
}
|
||||
}
|
||||
#if FULL_SYSTEM
|
||||
0x05: decode MODE_MODE {
|
||||
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();
|
||||
}
|
||||
#else
|
||||
0x05: SyscallInst::syscall('xc->syscall(Rax)',
|
||||
IsSyscall, IsNonSpeculative, IsSerializeAfter);
|
||||
#endif
|
||||
}
|
||||
0x06: Inst::CLTS();
|
||||
0x07: decode MODE_SUBMODE {
|
||||
0x0: decode OPSIZE {
|
||||
|
@ -399,12 +398,11 @@
|
|||
0x1: Inst::RDTSC();
|
||||
0x2: Inst::RDMSR();
|
||||
0x3: rdpmc();
|
||||
#if FULL_SYSTEM
|
||||
0x4: sysenter();
|
||||
#else
|
||||
0x4: SyscallInst::sysenter('xc->syscall(Rax)',
|
||||
0x4: decode FULL_SYSTEM {
|
||||
0: SyscallInst::sysenter('xc->syscall(Rax)',
|
||||
IsSyscall, IsNonSpeculative, IsSerializeAfter);
|
||||
#endif
|
||||
default: sysenter();
|
||||
}
|
||||
0x5: sysexit();
|
||||
0x6: Inst::UD2();
|
||||
0x7: getsec();
|
||||
|
|
Loading…
Reference in a new issue