vm_area.hpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #pragma once
  2. #include <stdint.h>
  3. #include <kernel/vfs.hpp>
  4. namespace kernel::mem {
  5. constexpr unsigned long MM_WRITE = 0x00000000'00000001;
  6. constexpr unsigned long MM_EXECUTE = 0x00000000'00000002;
  7. constexpr unsigned long MM_MAPPED = 0x00000000'00000004;
  8. constexpr unsigned long MM_ANONYMOUS = 0x00000000'00000008;
  9. constexpr unsigned long MM_INTERNAL_MASK = 0xffffffff'00000000;
  10. constexpr unsigned long MM_BREAK = 0x80000000'00000000;
  11. struct vm_area {
  12. uintptr_t start;
  13. uintptr_t end;
  14. unsigned long flags;
  15. fs::inode* mapped_file;
  16. std::size_t file_offset;
  17. constexpr bool is_avail(uintptr_t ostart, uintptr_t oend) const noexcept {
  18. return (ostart >= end || oend <= start);
  19. }
  20. constexpr bool operator<(const vm_area& rhs) const noexcept {
  21. return end <= rhs.start;
  22. }
  23. constexpr bool operator<(uintptr_t rhs) const noexcept {
  24. return end <= rhs;
  25. }
  26. friend constexpr bool operator<(uintptr_t lhs,
  27. const vm_area& rhs) noexcept {
  28. return lhs < rhs.start;
  29. }
  30. constexpr vm_area(uintptr_t start, unsigned long flags, uintptr_t end,
  31. fs::inode* mapped_file = nullptr, std::size_t offset = 0)
  32. : start{start}
  33. , end{end}
  34. , flags{flags}
  35. , mapped_file{mapped_file}
  36. , file_offset{offset} {}
  37. constexpr vm_area(uintptr_t start, unsigned long flags,
  38. fs::inode* mapped_file = nullptr, std::size_t offset = 0)
  39. : start{start}
  40. , end{start}
  41. , flags{flags}
  42. , mapped_file{mapped_file}
  43. , file_offset{offset} {}
  44. };
  45. } // namespace kernel::mem