There is still a bit of an issue after the last set of changes made by mlarkin@. The changed get_input_data() interface takes a pointer to a uint32_t as an argument, but only modifies the bytes that correspond to the access size. That means that if we read the value into an uint32_t that is allocated on the stack, because if the access size is less than 4 bytes, we end up with stack garbage in the variable. This is a problem in the mc146818 emulation code.
The result is that seabios (sometimes) detects the wrong memory size and subsequently triggers the following kernel printf: unknown memory type 1 for GPA 0x207bffd0 Not sure what happens with the VM at that point. It seems to be hanging. Diff below fixes the issue. As far as I can see the i8253 and i8259 emulation code isn't affected as the uint32_t stack variable gets converted into a uint8_t before being used. But perhaps we should initialize the stack variables there as well to prevent further accidents. ok? Index: mc146818.c =================================================================== RCS file: /cvs/src/usr.sbin/vmd/mc146818.c,v retrieving revision 1.10 diff -u -p -r1.10 mc146818.c --- mc146818.c 25 Mar 2017 22:36:53 -0000 1.10 +++ mc146818.c 26 Mar 2017 14:26:10 -0000 @@ -249,7 +249,7 @@ vcpu_exit_mc146818(struct vm_run_params union vm_exit *vei = vrp->vrp_exit; uint16_t port = vei->vei.vei_port; uint8_t dir = vei->vei.vei_dir; - uint32_t data; + uint32_t data = 0; get_input_data(vei, &data);