DM: Remove 'strictio' from UOS bootargs' options

- UOS will boot fail if 'strictio' is enabled ('-e' option), in this
   case (with '-e'), device model will block all PIO accesses whose
   handlers were not registered, after that, device model program will
   exit, hence UOS boot fail.

   actually, such kind of accesses exist, e.g. UOS would program
   PIT registers (port address: 0x43) if hpet is disabled.

 - For debug, we can trap unexpected PIO access in 'default_inout()'

Signed-off-by: Yonghua Huang <yonghua.huang@intel.com>
This commit is contained in:
Yonghua Huang 2018-06-27 21:53:39 +08:00 committed by lijinxia
parent 9f4404d0e6
commit 61cd6946d0
3 changed files with 4 additions and 22 deletions

View File

@ -88,13 +88,12 @@ register_default_iohandler(int start, int size)
}
int
emulate_inout(struct vmctx *ctx, int *pvcpu, struct pio_request *pio_request,
int strict)
emulate_inout(struct vmctx *ctx, int *pvcpu, struct pio_request *pio_request)
{
int bytes, flags, in, port;
inout_func_t handler;
void *arg;
int i, retval;
int retval;
bytes = pio_request->size;
in = (pio_request->direction == REQUEST_READ);
@ -104,17 +103,6 @@ emulate_inout(struct vmctx *ctx, int *pvcpu, struct pio_request *pio_request,
assert(bytes == 1 || bytes == 2 || bytes == 4);
handler = inout_handlers[port].handler;
if (strict) {
if (handler == default_inout)
return -1;
for (i = 1; i < bytes; i++) {
if (inout_handlers[port + i].handler != handler)
return -1;
}
}
flags = inout_handlers[port].flags;
arg = inout_handlers[port].arg;

View File

@ -77,7 +77,6 @@ static int guest_vmexit_on_hlt, guest_vmexit_on_pause;
static int virtio_msix = 1;
static int x2apic_mode; /* default is xAPIC */
static int strictio;
static int strictmsr = 1;
static int acpi;
@ -302,7 +301,7 @@ vmexit_inout(struct vmctx *ctx, struct vhm_request *vhm_req, int *pvcpu)
bytes = vhm_req->reqs.pio_request.size;
in = (vhm_req->reqs.pio_request.direction == REQUEST_READ);
error = emulate_inout(ctx, pvcpu, &vhm_req->reqs.pio_request, strictio);
error = emulate_inout(ctx, pvcpu, &vhm_req->reqs.pio_request);
if (error) {
fprintf(stderr, "Unhandled %s%c 0x%04x\n",
in ? "in" : "out",
@ -606,7 +605,6 @@ static struct option long_options[] = {
{"memsize", required_argument, 0, 'm' },
{"ioapic", no_argument, 0, 'I' },
{"vmexit_pause", no_argument, 0, 'P' },
{"strictio", no_argument, 0, 'e' },
{"rtc_localtime", no_argument, 0, 'u' },
{"uuid", required_argument, 0, 'U' },
{"strictmsr", no_argument, 0, 'w' },
@ -722,9 +720,6 @@ main(int argc, char *argv[])
case 'P':
guest_vmexit_on_pause = 1;
break;
case 'e':
strictio = 1;
break;
case 'u':
vrtc_enable_localtime(0);
break;

View File

@ -71,8 +71,7 @@ struct inout_port {
DATA_SET(inout_port_set, __CONCAT(__inout_port, __LINE__))
void init_inout(void);
int emulate_inout(struct vmctx *ctx, int *pvcpu, struct pio_request *req,
int strict);
int emulate_inout(struct vmctx *ctx, int *pvcpu, struct pio_request *req);
int register_inout(struct inout_port *iop);
int unregister_inout(struct inout_port *iop);
int init_bvmcons(void);