mirror of
https://github.com/gnif/LookingGlass.git
synced 2025-12-29 16:02:29 +00:00
[host] [c-host] added support to specify IVSHMEM device
[host] basic IVSHMEM device selecting implemented Minor fixes for IVSHMEM device scanning [c-host] added support to specify IVSHMEM device
This commit is contained in:
committed by
Geoffrey McRae
parent
53ade56b4e
commit
b5975e0f05
144
host/IVSHMEM.cpp
144
host/IVSHMEM.cpp
@@ -26,6 +26,77 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
IVSHMEM * IVSHMEM::m_instance = NULL;
|
||||
|
||||
void IVSHMEM::listDevices() {
|
||||
|
||||
HDEVINFO deviceInfoSet;
|
||||
PSP_DEVICE_INTERFACE_DETAIL_DATA infData = NULL;
|
||||
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
|
||||
|
||||
deviceInfoSet = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_DEVICEINTERFACE);
|
||||
ZeroMemory(&deviceInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA));
|
||||
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
|
||||
|
||||
fprintf(stderr, "Found devices:\n");
|
||||
|
||||
DWORD i = 0;
|
||||
while(SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, &GUID_DEVINTERFACE_IVSHMEM, i, &deviceInterfaceData) != FALSE)
|
||||
{
|
||||
DWORD reqSize = 0;
|
||||
SP_DEVINFO_DATA d;
|
||||
d.cbSize = sizeof(SP_DEVINFO_DATA);
|
||||
|
||||
SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, NULL, 0, &reqSize, &d);
|
||||
if (!reqSize)
|
||||
{
|
||||
fprintf(stderr, "SetupDiGetDeviceInterfaceDetail");
|
||||
break;
|
||||
}
|
||||
|
||||
infData = static_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(malloc(reqSize));
|
||||
ZeroMemory(infData, reqSize);
|
||||
infData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
|
||||
if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, infData, reqSize, NULL, NULL))
|
||||
{
|
||||
fprintf(stderr, "SetupDiGetDeviceInterfaceDetail");
|
||||
break;
|
||||
}
|
||||
|
||||
DWORD bus, addr, slot, func;
|
||||
|
||||
if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, &d,SPDRP_BUSNUMBER,NULL,(PBYTE)&bus,sizeof(bus),NULL))
|
||||
{
|
||||
DEBUG_ERROR("SetupDiGetDeviceRegistryProperty - SPDRP_BUSNUMBER: %lu\n", GetLastError());
|
||||
free(infData);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, &d,SPDRP_ADDRESS,NULL, (PBYTE)&addr,sizeof(addr),NULL))
|
||||
{
|
||||
DEBUG_ERROR("SetupDiGetDeviceRegistryProperty - SPDRP_ADDRESS: %lu\n", GetLastError());
|
||||
free(infData);
|
||||
break;
|
||||
}
|
||||
|
||||
slot = (addr >> 16) & 0xFFFF;
|
||||
func = addr & 0xFFFF;
|
||||
|
||||
fprintf(stderr, "[%lu] Found Device: %ls\n"
|
||||
" Bus: 0x%lx\n"
|
||||
" Slot: 0x%lx\n"
|
||||
" Func: 0x%lx\n",
|
||||
i, infData->DevicePath, bus, slot, func);
|
||||
i++;
|
||||
}
|
||||
|
||||
DWORD error = GetLastError();
|
||||
if (error != ERROR_NO_MORE_ITEMS)
|
||||
{
|
||||
fprintf(stderr, "Unknown error on index %u: %lu\n", i, error);
|
||||
}
|
||||
|
||||
fprintf(stderr, "%lu devices found\n\n", i);
|
||||
}
|
||||
|
||||
IVSHMEM::IVSHMEM() :
|
||||
m_initialized(false),
|
||||
m_handle(INVALID_HANDLE_VALUE),
|
||||
@@ -41,7 +112,7 @@ IVSHMEM::~IVSHMEM()
|
||||
DeInitialize();
|
||||
}
|
||||
|
||||
bool IVSHMEM::Initialize()
|
||||
bool IVSHMEM::Initialize(PCI_DEVICE dev)
|
||||
{
|
||||
if (m_initialized)
|
||||
DeInitialize();
|
||||
@@ -54,23 +125,13 @@ bool IVSHMEM::Initialize()
|
||||
ZeroMemory(&deviceInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA));
|
||||
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
|
||||
|
||||
while (true)
|
||||
DWORD devid = 0;
|
||||
while (SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, &GUID_DEVINTERFACE_IVSHMEM, devid, &deviceInterfaceData) != FALSE)
|
||||
{
|
||||
if (SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, &GUID_DEVINTERFACE_IVSHMEM, 0, &deviceInterfaceData) == FALSE)
|
||||
{
|
||||
DWORD error = GetLastError();
|
||||
if (error == ERROR_NO_MORE_ITEMS)
|
||||
{
|
||||
DEBUG_ERROR("Unable to enumerate the device, is it attached?");
|
||||
break;
|
||||
}
|
||||
|
||||
DEBUG_ERROR("SetupDiEnumDeviceInterfaces failed");
|
||||
break;
|
||||
}
|
||||
|
||||
DWORD reqSize = 0;
|
||||
SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, NULL, 0, &reqSize, NULL);
|
||||
SP_DEVINFO_DATA d;
|
||||
d.cbSize = sizeof(SP_DEVINFO_DATA);
|
||||
SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, NULL, 0, &reqSize, &d);
|
||||
if (!reqSize)
|
||||
{
|
||||
DEBUG_ERROR("SetupDiGetDeviceInterfaceDetail");
|
||||
@@ -83,22 +144,67 @@ bool IVSHMEM::Initialize()
|
||||
if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, infData, reqSize, NULL, NULL))
|
||||
{
|
||||
DEBUG_ERROR("SetupDiGetDeviceInterfaceDetail");
|
||||
free(infData);
|
||||
break;
|
||||
}
|
||||
|
||||
DWORD bus, addr, slot, func;
|
||||
|
||||
if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, &d,SPDRP_BUSNUMBER,NULL,(PBYTE)&bus,sizeof(bus),NULL))
|
||||
{
|
||||
DEBUG_ERROR("SetupDiGetDeviceRegistryProperty - SPDRP_BUSNUMBER");
|
||||
free(infData);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, &d,SPDRP_ADDRESS,NULL, (PBYTE)&addr,sizeof(addr),NULL))
|
||||
{
|
||||
DEBUG_ERROR("SetupDiGetDeviceRegistryProperty - SPDRP_ADDRESS");
|
||||
free(infData);
|
||||
break;
|
||||
}
|
||||
|
||||
slot = (addr >> 16) & 0xFFFF;
|
||||
func = addr & 0xFFFF;
|
||||
|
||||
if (dev.bus != bus || dev.addr != slot || dev.func != func) //not the right device, keep searching
|
||||
{
|
||||
free(infData);
|
||||
devid++;
|
||||
continue;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Found Device at Index %lu: %ls\n"
|
||||
" Bus: %lu\n"
|
||||
" Addr: %lu\n"
|
||||
" Func: %lu\n",
|
||||
devid, infData->DevicePath, bus, slot, func);
|
||||
|
||||
m_handle = CreateFile(infData->DevicePath, 0, 0, NULL, OPEN_EXISTING, 0, 0);
|
||||
if (m_handle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
DEBUG_ERROR("CreateFile returned INVALID_HANDLE_VALUE");
|
||||
free(infData);
|
||||
break;
|
||||
}
|
||||
|
||||
m_initialized = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (infData)
|
||||
free(infData);
|
||||
|
||||
DWORD error = GetLastError();
|
||||
if (m_initialized == false)
|
||||
{
|
||||
if (error == ERROR_NO_MORE_ITEMS)
|
||||
{
|
||||
DEBUG_ERROR("Unable to enumerate the device, is it attached?");
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_ERROR("Unable to enumerate the device. Error: %lu\n", error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
SetupDiDestroyDeviceInfoList(deviceInfoSet);
|
||||
return m_initialized;
|
||||
|
||||
Reference in New Issue
Block a user