hostmem-epc.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * QEMU host SGX EPC memory backend
  3. *
  4. * Copyright (C) 2019 Intel Corporation
  5. *
  6. * Authors:
  7. * Sean Christopherson <sean.j.christopherson@intel.com>
  8. *
  9. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  10. * See the COPYING file in the top-level directory.
  11. */
  12. #include <sys/ioctl.h>
  13. #include "qemu/osdep.h"
  14. #include "qom/object_interfaces.h"
  15. #include "qapi/error.h"
  16. #include "sysemu/hostmem.h"
  17. #include "hw/i386/hostmem-epc.h"
  18. static void
  19. sgx_epc_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
  20. {
  21. uint32_t ram_flags;
  22. char *name;
  23. int fd;
  24. if (!backend->size) {
  25. error_setg(errp, "can't create backend with size 0");
  26. return;
  27. }
  28. fd = qemu_open_old("/dev/sgx_vepc", O_RDWR);
  29. if (fd < 0) {
  30. error_setg_errno(errp, errno,
  31. "failed to open /dev/sgx_vepc to alloc SGX EPC");
  32. return;
  33. }
  34. name = object_get_canonical_path(OBJECT(backend));
  35. ram_flags = (backend->share ? RAM_SHARED : 0) | RAM_PROTECTED;
  36. memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend),
  37. name, backend->size, ram_flags,
  38. fd, 0, errp);
  39. g_free(name);
  40. }
  41. static void sgx_epc_backend_instance_init(Object *obj)
  42. {
  43. HostMemoryBackend *m = MEMORY_BACKEND(obj);
  44. m->share = true;
  45. m->merge = false;
  46. m->dump = false;
  47. }
  48. static void sgx_epc_backend_class_init(ObjectClass *oc, void *data)
  49. {
  50. HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc);
  51. bc->alloc = sgx_epc_backend_memory_alloc;
  52. }
  53. static const TypeInfo sgx_epc_backed_info = {
  54. .name = TYPE_MEMORY_BACKEND_EPC,
  55. .parent = TYPE_MEMORY_BACKEND,
  56. .instance_init = sgx_epc_backend_instance_init,
  57. .class_init = sgx_epc_backend_class_init,
  58. .instance_size = sizeof(HostMemoryBackendEpc),
  59. };
  60. static void register_types(void)
  61. {
  62. int fd = qemu_open_old("/dev/sgx_vepc", O_RDWR);
  63. if (fd >= 0) {
  64. close(fd);
  65. type_register_static(&sgx_epc_backed_info);
  66. }
  67. }
  68. type_init(register_types);