On Sun, Mar 26, 2017 at 04:40:03PM +0200, Mark Kettenis wrote: > 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? >
Yep, go for it > > 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); > >
