Advertisement
ItsTotallyRSX

memory api

Nov 27th, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.87 KB | None | 0 0
  1. /*
  2. Purpose: Linux specific low-level memory operations
  3. Author: Reece W.
  4. License: All Rights Reserved J. Reece Wilson
  5. */
  6. #pragma once
  7.  
  8. const size_t OL_ACCESS_READ = (1 << 0);
  9. const size_t OL_ACCESS_WRITE = (1 << 1);
  10. const size_t OL_ACCESS_EXECUTE = (1 << 2);
  11.  
  12. enum OLCacheType
  13. {
  14. kCacheCache = 0,
  15. kCacheWriteCombined = 1,
  16. kCacheNoCache = 2,
  17. kCacheWriteThrough = 3, // read cache, write cache and physical
  18. kCacheWriteProtected = 4 // read cache, write physical
  19. };
  20.  
  21. struct OLPageEntry
  22. {
  23. pgprot_t prot;
  24. size_t access;
  25. OLCacheType cache;
  26. };
  27.  
  28. // Describes mapped memory
  29. class OLGenericMappedBuffer : public OObject
  30. {
  31. public:
  32. virtual error_t GetVAStart(size_t &) = 0;
  33. virtual error_t GetVAEnd(size_t &) = 0;
  34. virtual error_t GetLength(size_t &) = 0;
  35. virtual error_t Unmap() = 0;
  36. };
  37.  
  38. // Describes a virtual buffer [or two if shared between user and kernel] pre-PTE allocation
  39. class OLBufferDescription : public OObject
  40. {
  41. public:
  42. // Add/remove/modify pages in virtual buffer
  43. virtual bool PageIsPresent(size_t idx) = 0;
  44. virtual error_t PageInsert (size_t idx, page_k page) = 0;
  45. virtual error_t PagePhysAddr (size_t idx, phys_addr_t & addr) = 0;
  46. virtual error_t PageCount (size_t & count) = 0;
  47.  
  48. // Temporarily access pages within this descriptior
  49. virtual error_t PageMap (size_t idx, void * & addr) = 0;
  50. virtual void PageUnmap (void * addr) = 0;
  51.  
  52. // Map
  53. virtual error_t SetupKernelAddress(size_t & address) = 0;
  54. virtual error_t SetupUserAddress(task_k task, size_t & address) = 0;
  55. // OUncontrollableRef -> life is controlled by OLBufferDescriptions container [or lack thereof]
  56. virtual error_t MapKernel(const OUncontrollableRef<OLGenericMappedBuffer> kernel, OLPageEntry pte) = 0;
  57. virtual error_t MapUser (const OUncontrollableRef<OLGenericMappedBuffer> kernel, OLPageEntry pte) = 0;
  58.  
  59. // Remap
  60. virtual error_t UpdateKernel(OLPageEntry pte) = 0;
  61. virtual error_t UpdateUser (OLPageEntry pte) = 0;
  62. virtual error_t UpdateAll (OLPageEntry pte) = 0;
  63. };
  64.  
  65. enum OLPageLocation
  66. {
  67. kPageInvalid = -1,
  68. kPageDMAVeryLow, // ZONE_DMA < 16M
  69. kPageDMA4GB, // ZONE_DMA32 < 2 ^ 32 -1
  70. kPageNormal // ZONE_NORMAL
  71. };
  72.  
  73. class OLMemoryInterface
  74. {
  75. public:
  76. virtual OLPageLocation GetPageLocation(size_t max) = 0; // nvidya demands ranges of (0, (1 << adapter bits) - 1)
  77. virtual page_k AllocatePage(OLPageLocation location) = 0;
  78. virtual void FreePage(page_k page) = 0;
  79.  
  80. virtual phys_addr_t PhysPage(page_k page) = 0;
  81. virtual void * MapPage(page_k page) = 0;
  82. virtual void UnmapPage(void * virt) = 0;
  83.  
  84. virtual void UpdatePageEntryCache (OLPageEntry &, OLCacheType cache) = 0;
  85. virtual void UpdatePageEntryAccess(OLPageEntry &, size_t access) = 0;
  86. virtual OLPageEntry CreatePageEntry(size_t access, OLCacheType cache) = 0;
  87.  
  88. virtual error_t NewBuilder(const OOutlivableRef<OLBufferDescription> builder) = 0;
  89.  
  90. };
  91.  
  92. LIBLINUX_SYM error_t GetLinuxMemoryInterface(const OUncontrollableRef<OLMemoryInterface> interface);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement