# HG changeset patch # User James Harper # Date 1198844509 -39600 # Node ID b9b4b731f89088bcdddc2d9bb8e502d63e5b0284 # Parent dfa772949c6ef8764d978090d1948e9fa7e56675 Tidyups and work on getting xennet at least as functional as it was before I started messing with it :) diff -r dfa772949c6e -r b9b4b731f890 common/include/xen_public.h --- a/common/include/xen_public.h Thu Dec 27 22:23:33 2007 +1100 +++ b/common/include/xen_public.h Fri Dec 28 23:21:49 2007 +1100 @@ -30,6 +30,9 @@ DEFINE_GUID( GUID_XEN_IFACE, 0x5C568AC5, typedef PHYSICAL_ADDRESS (*PXEN_ALLOCMMIO)(ULONG Length); +typedef PHYSICAL_ADDRESS +(*PXEN_FREEMEM)(PVOID Ptr); + typedef NTSTATUS (*PXEN_EVTCHN_BIND)(PVOID Context, evtchn_port_t Port, PKSERVICE_ROUTINE ServiceRoutine, PVOID ServiceContext); @@ -84,6 +87,7 @@ typedef struct _XEN_IFACE { INTERFACE InterfaceHeader; PXEN_ALLOCMMIO AllocMMIO; + PXEN_FREEMEM FreeMem; PXEN_EVTCHN_BIND EvtChn_Bind; PXEN_EVTCHN_UNBIND EvtChn_Unbind; diff -r dfa772949c6e -r b9b4b731f890 xenenum/sources --- a/xenenum/sources Thu Dec 27 22:23:33 2007 +1100 +++ b/xenenum/sources Fri Dec 28 23:21:49 2007 +1100 @@ -1,7 +1,7 @@ TARGETNAME=xenenum TARGETTYPE=DRIVER TARGETPATH=..\Target\$(DDK_TARGET_OS) -VERSION=0.5.0.12 +VERSION=0.5.0.11 KMDF_VERSION=1 MSC_WARNING_LEVEL=/W4 INF_NAME=xenenum diff -r dfa772949c6e -r b9b4b731f890 xenenum/xenenum.c --- a/xenenum/xenenum.c Thu Dec 27 22:23:33 2007 +1100 +++ b/xenenum/xenenum.c Fri Dec 28 23:21:49 2007 +1100 @@ -433,7 +433,10 @@ XenEnum_WatchHandler(char *Path, PVOID D RtlInitAnsiString(&AnsiBuf, Bits[1]); RtlAnsiStringToUnicodeString(&IdentificationDescription.DeviceType, &AnsiBuf, TRUE); IdentificationDescription.DeviceIndex = atoi(Bits[2]); - Status = WdfChildListAddOrUpdateChildDescriptionAsPresent(ChildList, &IdentificationDescription.Header, NULL); + if (IdentificationDescription.DeviceIndex > 0) + { + Status = WdfChildListAddOrUpdateChildDescriptionAsPresent(ChildList, &IdentificationDescription.Header, NULL); + } } else if (Count > 3) { @@ -534,6 +537,7 @@ XenEnum_ChildListCreateDevice(WDFCHILDLI ChildDeviceData->XenInterface.InterfaceHeader.InterfaceDereference = WdfDeviceInterfaceDereferenceNoOp; ChildDeviceData->XenInterface.AllocMMIO = XenInterface.AllocMMIO; + ChildDeviceData->XenInterface.FreeMem = XenInterface.FreeMem; ChildDeviceData->XenInterface.EvtChn_Bind = XenInterface.EvtChn_Bind; ChildDeviceData->XenInterface.EvtChn_Unbind = XenInterface.EvtChn_Unbind; diff -r dfa772949c6e -r b9b4b731f890 xennet/sources --- a/xennet/sources Thu Dec 27 22:23:33 2007 +1100 +++ b/xennet/sources Fri Dec 28 23:21:49 2007 +1100 @@ -1,7 +1,7 @@ TARGETNAME=XENNET TARGETTYPE=DRIVER TARGETPATH=..\Target\$(DDK_TARGET_OS) -VERSION=0.5.0.0 +VERSION=0.5.0.8 KMDF_VERSION=1 MSC_WARNING_LEVEL=/W4 INF_NAME=xennet diff -r dfa772949c6e -r b9b4b731f890 xennet/xennet.c --- a/xennet/xennet.c Thu Dec 27 22:23:33 2007 +1100 +++ b/xennet/xennet.c Fri Dec 28 23:21:49 2007 +1100 @@ -58,7 +58,7 @@ struct xennet_info UINT8 perm_mac_addr[ETH_ALEN]; UINT8 curr_mac_addr[ETH_ALEN]; - char Path[128]; +// char Path[128]; char BackendPath[128]; XEN_IFACE XenInterface; @@ -107,6 +107,8 @@ struct xennet_info ULONG64 stat_tx_error; ULONG64 stat_rx_error; ULONG64 stat_rx_no_buffer; + + KEVENT backend_ready_event; }; /* This function copied from linux's lib/vsprintf.c, see it for attribution */ @@ -403,7 +405,7 @@ XenNet_BackEndStateHandler(char *Path, P xi->XenInterface.XenBus_Read(xi->XenInterface.InterfaceHeader.Context, XBT_NIL, Path, &Value); be_state = atoi(Value); - ExFreePool(Value); + xi->XenInterface.FreeMem(Value); switch (be_state) { @@ -452,7 +454,7 @@ XenNet_BackEndStateHandler(char *Path, P for (i = 0; params[i].name; i++) { RtlStringCbPrintfA(TmpPath, ARRAY_SIZE(TmpPath), "%s/%s", - xi->Path, params[i].name); + xi->pdoData->Path, params[i].name); err = xi->XenInterface.XenBus_Printf(xi->XenInterface.InterfaceHeader.Context, XBT_NIL, TmpPath, "%d", params[i].value); if (err) @@ -469,7 +471,7 @@ XenNet_BackEndStateHandler(char *Path, P XenNet_AllocRXBuffers(xi); KdPrint((__DRIVER_NAME " Set Frontend state to Connected\n")); - RtlStringCbPrintfA(TmpPath, ARRAY_SIZE(TmpPath), "%s/state", xi->Path); + RtlStringCbPrintfA(TmpPath, ARRAY_SIZE(TmpPath), "%s/state", xi->pdoData->Path); xi->XenInterface.XenBus_Printf(xi->XenInterface.InterfaceHeader.Context, XBT_NIL, TmpPath, "%d", XenbusStateConnected); @@ -485,6 +487,7 @@ XenNet_BackEndStateHandler(char *Path, P case XenbusStateConnected: KdPrint((__DRIVER_NAME " Backend State Changed to Connected\n")); + KeSetEvent(&xi->backend_ready_event, 1, FALSE); break; case XenbusStateClosing: @@ -535,7 +538,6 @@ XenNet_Init( WDF_OBJECT_ATTRIBUTES wdf_attrs; char *msg; char *Value; - char **vif_devs; char TmpPath[128]; UNREFERENCED_PARAMETER(OpenErrorStatus); @@ -640,85 +642,59 @@ XenNet_Init( goto err; } - RtlStringCbPrintfA(TmpPath, ARRAY_SIZE(TmpPath), - "%s/%d/state", xi->pdoData->Path, xi->pdoData->DeviceIndex); - - msg = xi->XenInterface.XenBus_List(xi->XenInterface.InterfaceHeader.Context, - XBT_NIL, "device/vif", &vif_devs); - if (msg) + "%s/backend", xi->pdoData->Path); + KdPrint(("About to read %s to get backend path\n", TmpPath)); + xi->XenInterface.XenBus_Read(xi->XenInterface.InterfaceHeader.Context, + XBT_NIL, TmpPath, &Value); + if (!Value) { - KdPrint((__DRIVER_NAME ": " __FUNCTION__ ": List retval is nonzero!\n")); + KdPrint((__DRIVER_NAME " Failed to read backend path\n")); status = NDIS_STATUS_FAILURE; goto err; } - - for (i = 0; vif_devs[i]; i++) - { - if (i > 0) - { - KdPrint((__DRIVER_NAME "Can only handle 1 vif so far, ignoring vif %s\n", vif_devs[i])); - continue; - } - RtlStringCbPrintfA(xi->Path, ARRAY_SIZE(xi->Path), "device/vif/%s", vif_devs[i]); - - RtlStringCbPrintfA(TmpPath, ARRAY_SIZE(TmpPath), - "device/vif/%s/state", vif_devs[i]); - KdPrint(("%s\n", TmpPath)); + // Check for Value == NULL here + RtlStringCbCopyA(xi->BackendPath, ARRAY_SIZE(xi->BackendPath), Value); + KdPrint((__DRIVER_NAME "backend path = %s\n", xi->BackendPath)); - RtlStringCbPrintfA(TmpPath, ARRAY_SIZE(TmpPath), "%s/backend", xi->Path); - xi->XenInterface.XenBus_Read(xi->XenInterface.InterfaceHeader.Context, - XBT_NIL, TmpPath, &Value); - if (!Value) - { - KdPrint((__DRIVER_NAME " backend Read Failed\n")); - } - else - { - RtlStringCbCopyA(xi->BackendPath, ARRAY_SIZE(xi->BackendPath), Value); - KdPrint((__DRIVER_NAME "backend path = %s\n", xi->BackendPath)); - } - ExFreePool(Value); + KeInitializeEvent(&xi->backend_ready_event, SynchronizationEvent, FALSE); - /* Add watch on backend state */ - RtlStringCbPrintfA(TmpPath, ARRAY_SIZE(TmpPath), "%s/state", xi->BackendPath); - xi->XenInterface.XenBus_AddWatch(xi->XenInterface.InterfaceHeader.Context, + /* Add watch on backend state */ + RtlStringCbPrintfA(TmpPath, ARRAY_SIZE(TmpPath), "%s/state", xi->BackendPath); + xi->XenInterface.XenBus_AddWatch(xi->XenInterface.InterfaceHeader.Context, XBT_NIL, TmpPath, XenNet_BackEndStateHandler, xi); - /* get mac address */ - RtlStringCbPrintfA(TmpPath, ARRAY_SIZE(TmpPath), "%s/mac", xi->Path); - xi->XenInterface.XenBus_Read(xi->XenInterface.InterfaceHeader.Context, - XBT_NIL, TmpPath, &Value); - if (!Value) - { - KdPrint((__DRIVER_NAME " mac Read Failed\n")); - } - else - { - char *s, *e; - int i; - - s = Value; + // wait here for signal that we are all set up + KeWaitForSingleObject(&xi->backend_ready_event, Executive, KernelMode, FALSE, NULL); - for (i = 0; i < ETH_ALEN; i++) { - xi->perm_mac_addr[i] = (UINT8)simple_strtoul(s, &e, 16); - if ((s == e) || (*e != ((i == ETH_ALEN-1) ? '\0' : ':'))) { - KdPrint((__DRIVER_NAME "Error parsing MAC address\n")); - ExFreePool(Value); - ExFreePool(vif_devs); - status = NDIS_STATUS_FAILURE; - goto err; - } - s = e + 1; + /* get mac address */ + RtlStringCbPrintfA(TmpPath, ARRAY_SIZE(TmpPath), "%s/mac", xi->BackendPath); + xi->XenInterface.XenBus_Read(xi->XenInterface.InterfaceHeader.Context, + XBT_NIL, TmpPath, &Value); + if (!Value) + { + KdPrint((__DRIVER_NAME " mac Read Failed\n")); + status = NDIS_STATUS_FAILURE; + goto err; + } + else + { + char *s, *e; + int i; + s = Value; + for (i = 0; i < ETH_ALEN; i++) { + xi->perm_mac_addr[i] = (UINT8)simple_strtoul(s, &e, 16); + if ((s == e) || (*e != ((i == ETH_ALEN-1) ? '\0' : ':'))) { + KdPrint((__DRIVER_NAME "Error parsing MAC address\n")); + xi->XenInterface.FreeMem(Value); + status = NDIS_STATUS_FAILURE; + goto err; } - memcpy(xi->curr_mac_addr, xi->perm_mac_addr, ETH_ALEN); + s = e + 1; } - ExFreePool(Value); - - //XenVbd_HotPlugHandler(buffer, NULL); - //ExFreePoolWithTag(bdDevices[i], XENPCI_POOL_TAG); + memcpy(xi->curr_mac_addr, xi->perm_mac_addr, ETH_ALEN); + xi->XenInterface.FreeMem(Value); } - ExFreePool(vif_devs); return NDIS_STATUS_SUCCESS; diff -r dfa772949c6e -r b9b4b731f890 xenpci/sources --- a/xenpci/sources Thu Dec 27 22:23:33 2007 +1100 +++ b/xenpci/sources Fri Dec 28 23:21:49 2007 +1100 @@ -1,7 +1,7 @@ TARGETNAME=XENPCI TARGETTYPE=DRIVER TARGETPATH=..\Target\$(DDK_TARGET_OS) -VERSION=0.5.0.5 +VERSION=0.5.0.6 KMDF_VERSION=1 MSC_WARNING_LEVEL=/W4 INF_NAME=xenpci diff -r dfa772949c6e -r b9b4b731f890 xenpci/xenpci.c --- a/xenpci/xenpci.c Thu Dec 27 22:23:33 2007 +1100 +++ b/xenpci/xenpci.c Fri Dec 28 23:21:49 2007 +1100 @@ -203,6 +203,11 @@ DriverEntry(PDRIVER_OBJECT DriverObject, return status; } +static XenPCI_FreeMem(PVOID Ptr) +{ + ExFreePoolWithTag(Ptr, XENPCI_POOL_TAG); +} + static NTSTATUS get_hypercall_stubs(WDFDEVICE Device) { @@ -803,6 +808,7 @@ XenPCI_ChildListCreateDevice( ChildDeviceData->XenInterface.InterfaceHeader.InterfaceDereference = WdfDeviceInterfaceDereferenceNoOp; ChildDeviceData->XenInterface.AllocMMIO = XenPCI_AllocMMIO; + ChildDeviceData->XenInterface.FreeMem = XenPCI_FreeMem; ChildDeviceData->XenInterface.EvtChn_Bind = EvtChn_Bind; ChildDeviceData->XenInterface.EvtChn_Unbind = EvtChn_Unbind; diff -r dfa772949c6e -r b9b4b731f890 xenvbd/sources --- a/xenvbd/sources Thu Dec 27 22:23:33 2007 +1100 +++ b/xenvbd/sources Fri Dec 28 23:21:49 2007 +1100 @@ -1,7 +1,7 @@ TARGETNAME=XENVBD TARGETTYPE=DRIVER TARGETPATH=..\Target\$(DDK_TARGET_OS) -VERSION=0.5.0.5 +VERSION=0.5.0.6 KMDF_VERSION=1 MSC_WARNING_LEVEL=/W4 INF_NAME=xenvbd diff -r dfa772949c6e -r b9b4b731f890 xenvbd/xenvbd.inx --- a/xenvbd/xenvbd.inx Thu Dec 27 22:23:33 2007 +1100 +++ b/xenvbd/xenvbd.inx Fri Dec 28 23:21:49 2007 +1100 @@ -42,8 +42,6 @@ AddReg = XenVbd_Service_AddReg [XenVbd_Service_AddReg] HKR,"Parameters\PnpInterface", "0", 0x00010001, 0x00000001 -;HKR,,"LowerFilters",0x00010000,"XenAddResource" -HKR,"w00t"", "XXX", 0x00010001, 0x00000001 [XenVbd_Inst.NT.CoInstallers] AddReg=CoInstaller_AddReg