EventChannel.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /** @file
  2. Event Channel function implementation.
  3. Event channel are use to notify of an event that happened in a shared
  4. structure for example.
  5. Copyright (C) 2014, Citrix Ltd.
  6. SPDX-License-Identifier: BSD-2-Clause-Patent
  7. **/
  8. #include "EventChannel.h"
  9. #include <Library/XenHypercallLib.h>
  10. UINT32
  11. XenEventChannelNotify (
  12. IN XENBUS_DEVICE *Dev,
  13. IN evtchn_port_t Port
  14. )
  15. {
  16. INTN ReturnCode;
  17. evtchn_send_t Send;
  18. Send.port = Port;
  19. ReturnCode = XenHypercallEventChannelOp (EVTCHNOP_send, &Send);
  20. return (UINT32)ReturnCode;
  21. }
  22. UINT32
  23. EFIAPI
  24. XenBusEventChannelAllocate (
  25. IN XENBUS_PROTOCOL *This,
  26. IN domid_t DomainId,
  27. OUT evtchn_port_t *Port
  28. )
  29. {
  30. evtchn_alloc_unbound_t Parameter;
  31. UINT32 ReturnCode;
  32. Parameter.dom = DOMID_SELF;
  33. Parameter.remote_dom = DomainId;
  34. ReturnCode = (UINT32)XenHypercallEventChannelOp (
  35. EVTCHNOP_alloc_unbound,
  36. &Parameter
  37. );
  38. if (ReturnCode != 0) {
  39. DEBUG ((DEBUG_ERROR, "ERROR: alloc_unbound failed with rc=%d", ReturnCode));
  40. return ReturnCode;
  41. }
  42. *Port = Parameter.port;
  43. return ReturnCode;
  44. }
  45. UINT32
  46. EFIAPI
  47. XenBusEventChannelNotify (
  48. IN XENBUS_PROTOCOL *This,
  49. IN evtchn_port_t Port
  50. )
  51. {
  52. XENBUS_PRIVATE_DATA *Private;
  53. Private = XENBUS_PRIVATE_DATA_FROM_THIS (This);
  54. return XenEventChannelNotify (Private->Dev, Port);
  55. }
  56. UINT32
  57. EFIAPI
  58. XenBusEventChannelClose (
  59. IN XENBUS_PROTOCOL *This,
  60. IN evtchn_port_t Port
  61. )
  62. {
  63. evtchn_close_t Close;
  64. Close.port = Port;
  65. return (UINT32)XenHypercallEventChannelOp (EVTCHNOP_close, &Close);
  66. }