VMM: clean up IO emulation.
authorRonald G. Minnich <rminnich@gmail.com>
Fri, 3 Jun 2016 20:45:31 +0000 (13:45 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 4 Jun 2016 13:10:47 +0000 (09:10 -0400)
commit95849647be53a1bd02d510a8025cf2a9062c43c8
treee7f882b9603429054bb8cfe0e2e19aaa81a439ee
parentd6036f30abd7c52d8253b5b04ab56e7a45966236
VMM: clean up IO emulation.

The io emulation code was written early in the game and was not correct
in several ways.

The big change is that we DO note that an IO address is not supported
but DO NOT consider it an error. The hardware does not, and we should
not. We do log a message to stderr that there was IO to an unsupported
address, but people commonly do such IO operations to implement, e.g.,
timing loops. It's perfectly legal to do IO to nonexistant config space
registers, as well, so it makes no sense to check those either. We can't
assume that an IO to a bogus address or config space register is not
intended or mistaken.

There is only one error return from the io() function: IO instructions
we did not handle because we could not interpret them. In that case, the
function really has no option but to return false. In all other cases,
it should return true.

As a result, all the configread/write functions become void, io() itself
now returns a bool, and handle_io returns what io returns.

We should consider changing regp() so that writes "to air" go to a
different place than reads "from air", as one might argue that reads
"from air" should return all 1s. In real hardware, not even this
reasonable rule always applies, so it's hard to make a strong argument
either way.

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