evtchn_send_t Send;\r
\r
Send.port = Port;\r
- ReturnCode = XenHypercallEventChannelOp (Dev, EVTCHNOP_send, &Send);\r
+ ReturnCode = XenHypercallEventChannelOp (EVTCHNOP_send, &Send);\r
return (UINT32)ReturnCode;\r
}\r
\r
OUT evtchn_port_t *Port\r
)\r
{\r
- XENBUS_PRIVATE_DATA *Private;\r
evtchn_alloc_unbound_t Parameter;\r
UINT32 ReturnCode;\r
\r
- Private = XENBUS_PRIVATE_DATA_FROM_THIS (This);\r
-\r
Parameter.dom = DOMID_SELF;\r
Parameter.remote_dom = DomainId;\r
- ReturnCode = (UINT32)XenHypercallEventChannelOp (Private->Dev,\r
+ ReturnCode = (UINT32)XenHypercallEventChannelOp (\r
EVTCHNOP_alloc_unbound,\r
&Parameter);\r
if (ReturnCode != 0) {\r
IN evtchn_port_t Port\r
)\r
{\r
- XENBUS_PRIVATE_DATA *Private;\r
evtchn_close_t Close;\r
\r
- Private = XENBUS_PRIVATE_DATA_FROM_THIS (This);\r
Close.port = Port;\r
- return (UINT32)XenHypercallEventChannelOp (Private->Dev, EVTCHNOP_close, &Close);\r
+ return (UINT32)XenHypercallEventChannelOp (EVTCHNOP_close, &Close);\r
}\r
Parameters.idx = Index;\r
Parameters.space = XENMAPSPACE_grant_table;\r
Parameters.gpfn = (xen_pfn_t) ((UINTN) GrantTable >> EFI_PAGE_SHIFT) + Index;\r
- ReturnCode = XenHypercallMemoryOp (Dev, XENMEM_add_to_physmap, &Parameters);\r
+ ReturnCode = XenHypercallMemoryOp (XENMEM_add_to_physmap, &Parameters);\r
if (ReturnCode != 0) {\r
DEBUG ((EFI_D_ERROR, "Xen GrantTable, add_to_physmap hypercall error: %d\n", ReturnCode));\r
}\r
Parameters.domid = DOMID_SELF;\r
Parameters.gpfn = (xen_pfn_t) ((UINTN) GrantTable >> EFI_PAGE_SHIFT) + Index;\r
DEBUG ((EFI_D_INFO, "Xen GrantTable, removing %X\n", Parameters.gpfn));\r
- ReturnCode = XenHypercallMemoryOp (Dev, XENMEM_remove_from_physmap, &Parameters);\r
+ ReturnCode = XenHypercallMemoryOp (XENMEM_remove_from_physmap, &Parameters);\r
if (ReturnCode != 0) {\r
DEBUG ((EFI_D_ERROR, "Xen GrantTable, remove_from_physmap hypercall error: %d\n", ReturnCode));\r
}\r
\r
; INTN\r
; EFIAPI\r
-; XenHypercall2 (\r
+; __XenHypercall2 (\r
; IN VOID *HypercallAddr,\r
; IN OUT INTN Arg1,\r
; IN OUT INTN Arg2\r
; );\r
-global ASM_PFX(XenHypercall2)\r
-ASM_PFX(XenHypercall2):\r
+global ASM_PFX(__XenHypercall2)\r
+ASM_PFX(__XenHypercall2):\r
; Save only ebx, ecx is supposed to be a scratch register and needs to be\r
; saved by the caller\r
push ebx\r
\r
; INTN\r
; EFIAPI\r
-; XenHypercall2 (\r
+; __XenHypercall2 (\r
; IN VOID *HypercallAddr,\r
; IN OUT INTN Arg1,\r
; IN OUT INTN Arg2\r
; );\r
-global ASM_PFX(XenHypercall2)\r
-ASM_PFX(XenHypercall2):\r
+global ASM_PFX(__XenHypercall2)\r
+ASM_PFX(__XenHypercall2):\r
push rdi\r
push rsi\r
; Copy HypercallAddr to rax\r
#include "XenStore.h"\r
#include "XenBus.h"\r
\r
+#include <IndustryStandard/Xen/hvm/params.h>\r
+#include <IndustryStandard/Xen/memory.h>\r
\r
///\r
/// Driver Binding Protocol instance\r
STATIC EFI_LOCK mMyDeviceLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_CALLBACK);\r
STATIC XENBUS_DEVICE *mMyDevice = NULL;\r
\r
+/**\r
+ Map the shared_info_t page into memory.\r
+\r
+ @param Dev A XENBUS_DEVICE instance.\r
+\r
+ @retval EFI_SUCCESS Dev->SharedInfo whill contain a pointer to\r
+ the shared info page\r
+ @retval EFI_LOAD_ERROR The shared info page could not be mapped. The\r
+ hypercall returned an error.\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+XenGetSharedInfoPage (\r
+ IN OUT XENBUS_DEVICE *Dev\r
+ )\r
+{\r
+ xen_add_to_physmap_t Parameter;\r
+\r
+ ASSERT (Dev->SharedInfo == NULL);\r
+\r
+ Parameter.domid = DOMID_SELF;\r
+ Parameter.space = XENMAPSPACE_shared_info;\r
+ Parameter.idx = 0;\r
+\r
+ //\r
+ // using reserved page because the page is not released when Linux is\r
+ // starting because of the add_to_physmap. QEMU might try to access the\r
+ // page, and fail because it have no right to do so (segv).\r
+ //\r
+ Dev->SharedInfo = AllocateReservedPages (1);\r
+ Parameter.gpfn = (UINTN) Dev->SharedInfo >> EFI_PAGE_SHIFT;\r
+ if (XenHypercallMemoryOp (XENMEM_add_to_physmap, &Parameter) != 0) {\r
+ FreePages (Dev->SharedInfo, 1);\r
+ Dev->SharedInfo = NULL;\r
+ return EFI_LOAD_ERROR;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
Unloads an image.\r
\r
MmioAddr = BarDesc->AddrRangeMin;\r
FreePool (BarDesc);\r
\r
- Status = XenHyperpageInit (Dev);\r
+ Status = XenHyperpageInit ();\r
if (EFI_ERROR (Status)) {\r
DEBUG ((EFI_D_ERROR, "XenBus: Unable to retrieve the hyperpage.\n"));\r
Status = EFI_UNSUPPORTED;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
LIST_ENTRY ChildList;\r
\r
- VOID *Hyperpage;\r
shared_info_t *SharedInfo;\r
};\r
\r
#include <IndustryStandard/Xen/hvm/params.h>\r
#include <IndustryStandard/Xen/memory.h>\r
\r
+STATIC VOID *HyperPage;\r
+\r
+//\r
+// Interface exposed by the ASM implementation of the core hypercall\r
+//\r
+INTN\r
+EFIAPI\r
+__XenHypercall2 (\r
+ IN VOID *HypercallAddr,\r
+ IN OUT INTN Arg1,\r
+ IN OUT INTN Arg2\r
+ );\r
+\r
EFI_STATUS\r
XenHyperpageInit (\r
- IN OUT XENBUS_DEVICE *Dev\r
)\r
{\r
EFI_HOB_GUID_TYPE *GuidHob;\r
return EFI_NOT_FOUND;\r
}\r
XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob);\r
- Dev->Hyperpage = XenInfo->HyperPages;\r
+ HyperPage = XenInfo->HyperPages;\r
return EFI_SUCCESS;\r
}\r
\r
UINT64\r
XenHypercallHvmGetParam (\r
- IN XENBUS_DEVICE *Dev,\r
IN UINT32 Index\r
)\r
{\r
xen_hvm_param_t Parameter;\r
INTN Error;\r
\r
- ASSERT (Dev->Hyperpage != NULL);\r
-\r
Parameter.domid = DOMID_SELF;\r
Parameter.index = Index;\r
- Error = XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_hvm_op * 32,\r
+ Error = XenHypercall2 (__HYPERVISOR_hvm_op,\r
HVMOP_get_param, (INTN) &Parameter);\r
if (Error != 0) {\r
DEBUG ((EFI_D_ERROR,\r
\r
INTN\r
XenHypercallMemoryOp (\r
- IN XENBUS_DEVICE *Dev,\r
IN UINTN Operation,\r
IN OUT VOID *Arguments\r
)\r
{\r
- ASSERT (Dev->Hyperpage != NULL);\r
- return XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_memory_op * 32,\r
+ return XenHypercall2 (__HYPERVISOR_memory_op,\r
Operation, (INTN) Arguments);\r
}\r
\r
INTN\r
XenHypercallEventChannelOp (\r
- IN XENBUS_DEVICE *Dev,\r
IN INTN Operation,\r
IN OUT VOID *Arguments\r
)\r
{\r
- ASSERT (Dev->Hyperpage != NULL);\r
- return XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_event_channel_op * 32,\r
+ return XenHypercall2 (__HYPERVISOR_event_channel_op,\r
Operation, (INTN) Arguments);\r
}\r
\r
-EFI_STATUS\r
-XenGetSharedInfoPage (\r
- IN OUT XENBUS_DEVICE *Dev\r
+INTN\r
+EFIAPI\r
+XenHypercall2 (\r
+ IN UINTN HypercallID,\r
+ IN OUT INTN Arg1,\r
+ IN OUT INTN Arg2\r
)\r
{\r
- xen_add_to_physmap_t Parameter;\r
+ ASSERT (HyperPage != NULL);\r
\r
- ASSERT (Dev->SharedInfo == NULL);\r
-\r
- Parameter.domid = DOMID_SELF;\r
- Parameter.space = XENMAPSPACE_shared_info;\r
- Parameter.idx = 0;\r
-\r
- //\r
- // using reserved page because the page is not released when Linux is\r
- // starting because of the add_to_physmap. QEMU might try to access the\r
- // page, and fail because it have no right to do so (segv).\r
- //\r
- Dev->SharedInfo = AllocateReservedPages (1);\r
- Parameter.gpfn = (UINTN) Dev->SharedInfo >> EFI_PAGE_SHIFT;\r
- if (XenHypercallMemoryOp (Dev, XENMEM_add_to_physmap, &Parameter) != 0) {\r
- FreePages (Dev->SharedInfo, 1);\r
- Dev->SharedInfo = NULL;\r
- return EFI_LOAD_ERROR;\r
- }\r
-\r
- return EFI_SUCCESS;\r
+ return __XenHypercall2 ((UINT8*)HyperPage + HypercallID * 32, Arg1, Arg2);\r
}\r
\r
/**\r
This function will put the two arguments in the right place (registers) and\r
- call HypercallAddr, which correspond to an entry in the hypercall pages.\r
+ invoke the hypercall identified by HypercallID.\r
\r
- @param HypercallAddr A memory address where the hypercall to call is.\r
+ @param HypercallID The symbolic ID of the hypercall to be invoked\r
@param Arg1 First argument.\r
@param Arg2 Second argument.\r
\r
INTN\r
EFIAPI\r
XenHypercall2 (\r
- IN VOID *HypercallAddr,\r
+ IN INTN HypercallID,\r
IN OUT INTN Arg1,\r
IN OUT INTN Arg2\r
);\r
**/\r
EFI_STATUS\r
XenHyperpageInit (\r
- XENBUS_DEVICE *Dev\r
);\r
\r
/**\r
Return the value of the HVM parameter Index.\r
\r
- @param Dev A XENBUS_DEVICE instance.\r
@param Index The parameter to get, e.g. HVM_PARAM_STORE_EVTCHN.\r
\r
@return The value of the asked parameter or 0 in case of error.\r
**/\r
UINT64\r
XenHypercallHvmGetParam (\r
- XENBUS_DEVICE *Dev,\r
UINT32 Index\r
);\r
\r
/**\r
Hypercall to do different operation on the memory.\r
\r
- @param Dev A XENBUS_DEVICE instance.\r
@param Operation The operation number, e.g. XENMEM_add_to_physmap.\r
@param Arguments The arguments associated to the operation.\r
\r
**/\r
INTN\r
XenHypercallMemoryOp (\r
- IN XENBUS_DEVICE *Dev,\r
IN UINTN Operation,\r
IN OUT VOID *Arguments\r
);\r
/**\r
Do an operation on the event channels.\r
\r
- @param Dev A XENBUS_DEVICE instance.\r
@param Operation The operation number, e.g. EVTCHNOP_send.\r
@param Arguments The argument associated to the operation.\r
\r
**/\r
INTN\r
XenHypercallEventChannelOp (\r
- IN XENBUS_DEVICE *Dev,\r
IN INTN Operation,\r
IN OUT VOID *Arguments\r
);\r
\r
-/**\r
- Map the shared_info_t page into memory.\r
-\r
- @param Dev A XENBUS_DEVICE instance.\r
-\r
- @retval EFI_SUCCESS Dev->SharedInfo whill contain a pointer to\r
- the shared info page\r
- @retval EFI_LOAD_ERROR The shared info page could not be mapped. The\r
- hypercall returned an error.\r
-**/\r
-EFI_STATUS\r
-XenGetSharedInfoPage (\r
- IN OUT XENBUS_DEVICE *Dev\r
- );\r
-\r
#endif\r
\r
xs.Dev = Dev;\r
\r
- xs.EventChannel = (evtchn_port_t)XenHypercallHvmGetParam (Dev, HVM_PARAM_STORE_EVTCHN);\r
- XenStoreGpfn = (UINTN)XenHypercallHvmGetParam (Dev, HVM_PARAM_STORE_PFN);\r
+ xs.EventChannel = (evtchn_port_t)XenHypercallHvmGetParam (HVM_PARAM_STORE_EVTCHN);\r
+ XenStoreGpfn = (UINTN)XenHypercallHvmGetParam (HVM_PARAM_STORE_PFN);\r
xs.XenStore = (VOID *) (XenStoreGpfn << EFI_PAGE_SHIFT);\r
DEBUG ((EFI_D_INFO, "XenBusInit: XenBus rings @%p, event channel %x\n",\r
xs.XenStore, xs.EventChannel));\r