On Thu, May 11, 2017 at 11:22:02PM +0000, Xu, Anthony
has a couple of different methods to accomplish this mode
switching - it can directly switch modes (C16_BIG switch) or it can
use a helper in SMM mode to perform the switch (C16_SMM). The
preferred method is C16_SMM as C16_BIG isn't available in VM86 mode
and it also clobbers the 16bit segment registers.
Why does SeaBios use VM86 mode?
As Paolo mentioned, SeaBIOS doesn't use it, but it must support
callers that use it.
vtx supports real mode long time ago.
C16_SMM is slow because it causes several extra switches between VM and QEMU.
I would prefer C16_BIG for better performance.
Does SeaBios know if it runs in real mode or VM86 mode?
Can SeaBios choose C16_SMM/C16_BIG based on VCPU mode?
Yes, SeaBIOS could use the smsw instruction (see x86.h:cr0_vm86_read)
to check if it is in VM86 mode. Using C16_BIG would still clobber the
segment registers, but it might be worth that risk to avoid the extra
overhead of C16_SMM.
I don't think the SMM overhead is that bad (is SMM only used on QEMU?).
At least for KVM it's not bad, maybe 4000 clock cycles roundtrip
(SeaBIOS does two such trips).
For TCG I have a patch to reduce it substantially but I haven't had time
to send it yet.