vm_area.hpp 1.9 KB

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