UserOrKernelBuffer.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <Kernel/Memory/MemoryManager.h>
  8. #include <Kernel/UserOrKernelBuffer.h>
  9. namespace Kernel {
  10. bool UserOrKernelBuffer::is_kernel_buffer() const
  11. {
  12. return !Memory::is_user_address(VirtualAddress(m_buffer));
  13. }
  14. KResultOr<NonnullOwnPtr<KString>> UserOrKernelBuffer::try_copy_into_kstring(size_t size) const
  15. {
  16. if (!m_buffer)
  17. return EINVAL;
  18. if (Memory::is_user_address(VirtualAddress(m_buffer))) {
  19. char* buffer;
  20. auto kstring = KString::try_create_uninitialized(size, buffer);
  21. if (!kstring)
  22. return ENOMEM;
  23. if (!copy_from_user(buffer, m_buffer, size))
  24. return EFAULT;
  25. return kstring.release_nonnull();
  26. }
  27. auto kstring = KString::try_create(ReadonlyBytes { m_buffer, size });
  28. if (!kstring)
  29. return ENOMEM;
  30. return kstring.release_nonnull();
  31. }
  32. bool UserOrKernelBuffer::write(const void* src, size_t offset, size_t len)
  33. {
  34. if (!m_buffer)
  35. return false;
  36. if (Memory::is_user_address(VirtualAddress(m_buffer)))
  37. return copy_to_user(m_buffer + offset, src, len);
  38. memcpy(m_buffer + offset, src, len);
  39. return true;
  40. }
  41. bool UserOrKernelBuffer::read(void* dest, size_t offset, size_t len) const
  42. {
  43. if (!m_buffer)
  44. return false;
  45. if (Memory::is_user_address(VirtualAddress(m_buffer)))
  46. return copy_from_user(dest, m_buffer + offset, len);
  47. memcpy(dest, m_buffer + offset, len);
  48. return true;
  49. }
  50. bool UserOrKernelBuffer::memset(int value, size_t offset, size_t len)
  51. {
  52. if (!m_buffer)
  53. return false;
  54. if (Memory::is_user_address(VirtualAddress(m_buffer)))
  55. return memset_user(m_buffer + offset, value, len);
  56. ::memset(m_buffer + offset, value, len);
  57. return true;
  58. }
  59. }