vm io: reset on an outb to cf9
authorRonald G. Minnich <rminnich@gmail.com>
Wed, 6 Sep 2017 17:43:06 +0000 (10:43 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 7 Sep 2017 14:23:13 +0000 (10:23 -0400)
commitd4aaa78877d48a066b50dec983ecabd46da94da4
tree9b26e74d54dd37f2ee021eb38bc69bd2355c882c
parent448bc3aae2f4a89a7e8e85e3ebc9fab7030ff311
vm io: reset on an outb to cf9

On an outb of (1 << 2) to cf9, exit the vm, since that is the reset register.

While there are some bits in the control register that affect
the type of reset, they're not important in a VM since they relate
to hardware that doesn't exist. We can just reset if bit 2 is a 1.

Why cf9? Why do IO at all? There are good arguments that this could be
a vmcall, but what's nice about cf9 is that it's standard, and has
been forever. Further, you can cause this reset to happen easily from
user mode. And that's very nice.

This is tested and working for any value with bit 2 clear (no reset)
and any value with bit 2 set (reset). Where was it all my life?

The following simple handy dandy tool is very useful on linux.

int main(int argc, char *argv[])
{
int i = 6;

if (argc > 1)
i = strtoull(argv[1], 0, 0);
iopl(3);
outb(i, 0xcf9);
exit(0)
}

// on linux:
// cc -static -o cf9 cf9.c

Change-Id: I727102a1187859d8c800fcce46b34fb3524f2b0e
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/vmm/io.c