UserOrKernelBuffer.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. ErrorOr<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 = TRY(KString::try_create_uninitialized(size, buffer));
  21. TRY(copy_from_user(buffer, m_buffer, size));
  22. return kstring;
  23. }
  24. return KString::try_create(ReadonlyBytes { m_buffer, size });
  25. }
  26. ErrorOr<void> UserOrKernelBuffer::write(void const* src, size_t offset, size_t len)
  27. {
  28. if (!m_buffer)
  29. return EFAULT;
  30. if (Memory::is_user_address(VirtualAddress(m_buffer)))
  31. return copy_to_user(m_buffer + offset, src, len);
  32. memcpy(m_buffer + offset, src, len);
  33. return {};
  34. }
  35. ErrorOr<void> UserOrKernelBuffer::read(void* dest, size_t offset, size_t len) const
  36. {
  37. if (!m_buffer)
  38. return EFAULT;
  39. if (Memory::is_user_address(VirtualAddress(m_buffer)))
  40. return copy_from_user(dest, m_buffer + offset, len);
  41. memcpy(dest, m_buffer + offset, len);
  42. return {};
  43. }
  44. ErrorOr<void> UserOrKernelBuffer::memset(int value, size_t offset, size_t len)
  45. {
  46. if (!m_buffer)
  47. return EFAULT;
  48. if (Memory::is_user_address(VirtualAddress(m_buffer)))
  49. return memset_user(m_buffer + offset, value, len);
  50. ::memset(m_buffer + offset, value, len);
  51. return {};
  52. }
  53. }