Roman Kononov wrote:
Darmawan Salihun wrote:
As I couldn't find any better replacement to the PCI direct I/O function at the moment (which is needed in chipset_enable and board_enable), I will try to implement them using a quite old kernel mode API, i.e. HalGetBusData and HalSetBusData. I hope the kernel "emulates" these functions so that it works like in NT4 and Windows 2000.
A more "portable" way:
Make all CPUs spinning inside a DPC function: KeQueryActiveProcessors() is used to get all processors. KeSetTargetProcessorDpc() is used to tie the DPC function and particular SMP processors. When all CPUs are spinning inside the function, one of them does IO (CF8/CFC) to the PCI configuration space. After the IO completes, let all DPC functions finish.
Roman
After discussing about the access method at length with more experienced Windows driver developers. I think if HalGetBusData is not working at all then direct I/O port access with your "multiprocessor-aware kernel thread protection" is the "safest" method.
--Darmawan Salihun