MemoryDevice.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Memory.h>
  7. #include <AK/StdLibExtras.h>
  8. #include <Kernel/Arch/PC/BIOS.h>
  9. #include <Kernel/Devices/MemoryDevice.h>
  10. #include <Kernel/Memory/AnonymousVMObject.h>
  11. #include <Kernel/Sections.h>
  12. namespace Kernel {
  13. UNMAP_AFTER_INIT NonnullRefPtr<MemoryDevice> MemoryDevice::must_create()
  14. {
  15. auto memory_device_or_error = try_create_device<MemoryDevice>();
  16. // FIXME: Find a way to propagate errors
  17. VERIFY(!memory_device_or_error.is_error());
  18. return memory_device_or_error.release_value();
  19. }
  20. UNMAP_AFTER_INIT MemoryDevice::MemoryDevice()
  21. : CharacterDevice(1, 1)
  22. {
  23. }
  24. UNMAP_AFTER_INIT MemoryDevice::~MemoryDevice()
  25. {
  26. }
  27. KResultOr<size_t> MemoryDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t)
  28. {
  29. TODO();
  30. }
  31. void MemoryDevice::did_seek(OpenFileDescription&, off_t)
  32. {
  33. TODO();
  34. }
  35. KResultOr<Memory::Region*> MemoryDevice::mmap(Process& process, OpenFileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
  36. {
  37. auto viewed_address = PhysicalAddress(offset);
  38. dbgln("MemoryDevice: Trying to mmap physical memory at {} for range of {} bytes", viewed_address, range.size());
  39. if (!MM.is_allowed_to_mmap_to_userspace(viewed_address, range)) {
  40. dbgln("MemoryDevice: Trying to mmap physical memory at {} for range of {} bytes failed due to violation of access", viewed_address, range.size());
  41. return EINVAL;
  42. }
  43. auto vmobject = TRY(Memory::AnonymousVMObject::try_create_for_physical_range(viewed_address, range.size()));
  44. dbgln("MemoryDevice: Mapped physical memory at {} for range of {} bytes", viewed_address, range.size());
  45. return process.address_space().allocate_region_with_vmobject(
  46. range,
  47. move(vmobject),
  48. 0,
  49. "Mapped Physical Memory",
  50. prot,
  51. shared);
  52. }
  53. }