win_memmap.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "platform_api_vmcore.h"
  6. void * os_mmap(void *hint, size_t size, int prot, int flags)
  7. {
  8. DWORD AllocType = MEM_RESERVE | MEM_COMMIT;
  9. DWORD flProtect = PAGE_NOACCESS;
  10. size_t request_size, page_size;
  11. void *addr;
  12. page_size = getpagesize();
  13. request_size = (size + page_size - 1) & ~(page_size - 1);
  14. if (request_size < size)
  15. /* integer overflow */
  16. return NULL;
  17. if (prot & MMAP_PROT_EXEC) {
  18. if (prot & MMAP_PROT_WRITE)
  19. flProtect = PAGE_EXECUTE_READWRITE;
  20. else
  21. flProtect = PAGE_EXECUTE_READ;
  22. }
  23. else if (prot & MMAP_PROT_WRITE)
  24. flProtect = PAGE_READWRITE;
  25. else if (prot & MMAP_PROT_READ)
  26. flProtect = PAGE_READONLY;
  27. addr = VirtualAlloc((LPVOID)hint, request_size, AllocType,
  28. flProtect);
  29. return addr;
  30. }
  31. void
  32. os_munmap(void *addr, size_t size)
  33. {
  34. size_t page_size = getpagesize();
  35. size_t request_size = (size + page_size - 1) & ~(page_size - 1);
  36. if (addr) {
  37. if (VirtualFree(addr, 0, MEM_RELEASE) == 0) {
  38. if (VirtualFree(addr, size, MEM_DECOMMIT) == 0) {
  39. os_printf("os_munmap error addr:%p, size:0x%lx, errno:%d\n",
  40. addr, request_size, errno);
  41. }
  42. }
  43. }
  44. }
  45. int
  46. os_mprotect(void *addr, size_t size, int prot)
  47. {
  48. DWORD AllocType = MEM_RESERVE | MEM_COMMIT;
  49. DWORD flProtect = PAGE_NOACCESS;
  50. if (!addr)
  51. return 0;
  52. if (prot & MMAP_PROT_EXEC) {
  53. if (prot & MMAP_PROT_WRITE)
  54. flProtect = PAGE_EXECUTE_READWRITE;
  55. else
  56. flProtect = PAGE_EXECUTE_READ;
  57. }
  58. else if (prot & MMAP_PROT_WRITE)
  59. flProtect = PAGE_READWRITE;
  60. else if (prot & MMAP_PROT_READ)
  61. flProtect = PAGE_READONLY;
  62. return VirtualProtect((LPVOID)addr, size, flProtect, NULL);
  63. }
  64. void
  65. os_dcache_flush(void)
  66. {
  67. }