TypedMapping.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/StringView.h>
  8. #include <Kernel/Memory/MemoryManager.h>
  9. namespace Kernel::Memory {
  10. template<typename T>
  11. struct TypedMapping {
  12. const T* ptr() const { return reinterpret_cast<const T*>(region->vaddr().offset(offset).as_ptr()); }
  13. T* ptr() { return reinterpret_cast<T*>(region->vaddr().offset(offset).as_ptr()); }
  14. const T* operator->() const { return ptr(); }
  15. T* operator->() { return ptr(); }
  16. const T& operator*() const { return *ptr(); }
  17. T& operator*() { return *ptr(); }
  18. OwnPtr<Region> region;
  19. size_t offset { 0 };
  20. };
  21. template<typename T>
  22. static TypedMapping<T> map_typed(PhysicalAddress paddr, size_t length, Region::Access access = Region::Access::Read)
  23. {
  24. TypedMapping<T> table;
  25. size_t mapping_length = page_round_up(paddr.offset_in_page() + length);
  26. table.region = MM.allocate_kernel_region(paddr.page_base(), mapping_length, {}, access);
  27. table.offset = paddr.offset_in_page();
  28. return table;
  29. }
  30. template<typename T>
  31. static TypedMapping<T> map_typed(PhysicalAddress paddr)
  32. {
  33. return map_typed<T>(paddr, sizeof(T));
  34. }
  35. template<typename T>
  36. static TypedMapping<T> map_typed_writable(PhysicalAddress paddr)
  37. {
  38. return map_typed<T>(paddr, sizeof(T), Region::Access::Read | Region::Access::Write);
  39. }
  40. }