UserOrKernelBuffer.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/UserOrKernelBuffer.h>
  7. #include <Kernel/VM/MemoryManager.h>
  8. namespace Kernel {
  9. bool UserOrKernelBuffer::is_kernel_buffer() const
  10. {
  11. return !is_user_address(VirtualAddress(m_buffer));
  12. }
  13. String UserOrKernelBuffer::copy_into_string(size_t size) const
  14. {
  15. if (!m_buffer)
  16. return {};
  17. if (is_user_address(VirtualAddress(m_buffer))) {
  18. char* buffer;
  19. auto data_copy = StringImpl::create_uninitialized(size, buffer);
  20. if (!copy_from_user(buffer, m_buffer, size))
  21. return {};
  22. return data_copy;
  23. }
  24. return String(ReadonlyBytes { m_buffer, size });
  25. }
  26. bool UserOrKernelBuffer::write(const void* src, size_t offset, size_t len)
  27. {
  28. if (!m_buffer)
  29. return false;
  30. if (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 true;
  34. }
  35. bool UserOrKernelBuffer::read(void* dest, size_t offset, size_t len) const
  36. {
  37. if (!m_buffer)
  38. return false;
  39. if (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 true;
  43. }
  44. bool UserOrKernelBuffer::memset(int value, size_t offset, size_t len)
  45. {
  46. if (!m_buffer)
  47. return false;
  48. if (is_user_address(VirtualAddress(m_buffer)))
  49. return memset_user(m_buffer + offset, value, len);
  50. ::memset(m_buffer + offset, value, len);
  51. return true;
  52. }
  53. }