Hi,

 I had a look at your patches regarding I/O port registration but they are 
unfortunately not correct. You seem to have a misconception of how port I/O 
works in the x86 architecture and assume that it behaves much like memory. 
That's not the case.

 You already suspected that you were doing something wrong when you tried to 
adapt the VGA ports 0x1ce/0x1cf. Those ports highlight how things really 
behave--it's possible to have a 16-bit port at address N and another 16-bit 
port at address N+1 and those ports do not overlap. A classic and very 
widespread example found in real hardware is the IDE data port (typically at 
0x1F0) which is accessed as 16-bit or 32-bit, yet is completely separate from 
the ports at addresses 0x1f1/0x1f2/0x1f3 (feature register/sector count/sector 
number).

 VirtualBox models this behavior. The I/O port registration via 
PDMDevHlpIOPortRegister() determines the range of I/O addresses which a device 
responds to, but it is up to the device to deal with byte/word/dword accesses 
to each individual address.

 In reality, it is possible to have even more interesting behavior. As an 
example, consider the CONFIG_ADDRESS PCI register at 0xCF8 (you came across 
that one too). The PCI 2.2 specification says in section 3.2.2.3.2, Software 
Generation of Configuration Transactions: "[...] the only I/O Space consumed by 
this register is a DWORD at the given address. I/O devices that share the same 
address but use BYTE or WORD registers are not affected because their 
transactions will pass through the host bridge unchanged." VirtualBox does not 
model the case where different devices respond to different-size accesses at 
the same address because it never comes up with the hardware we emulate. I 
should also point out that the CONFIG_DATA register at 0xCFC *does* behave 
somewhat more like memory and responds to accesses within the entire 
0xCFC-0xCFF range... but that is more of an exception than the rule.

 Your patch tries to change the CONFIG_ADDRESS (0xCF8) registration to cover 4 
consecutive I/O addresses, but as you can see in the quote above, that would 
directly contradict the PCI specification which states that the PCI host bridge 
does not respond to port I/O in the 0xCF9-0xCFB range. In theory, a completely 
different device could respond to I/O accesses in that range.

 The bottom line is that architecturally, the I/O port address and the access 
size are considered independently. In VirtualBox, the port address alone 
determines which device will handle the access, and it's then up to the device 
to decide what it does with the access size. This is a slightly simplified 
version of the actual hardware behavior, but it's sufficient to emulate all 
common hardware.


      Regards,

          Michal


---------------
Hi,

we had for VBox@Genode/Nova to implement our own version of the IO
Monitor. During usage we detected some minor issues in the ACPI, PCI and
VGA device model between announced/registered IO ports access width and
its actual access width usage.

Please review the patches and tell me whether they/some of them make
sense to you. They are in the first place non-critical, however our IOM
implementation complains/deny access by guests to device models if the
i/O access width is bigger than registered by the device model.

_______________________________________________
vbox-dev mailing list
vbox-dev@virtualbox.org
https://www.virtualbox.org/mailman/listinfo/vbox-dev

Reply via email to