DeviceControlDevice.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /*
  2. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Devices/DeviceManagement.h>
  7. #include <Kernel/Devices/Generic/DeviceControlDevice.h>
  8. namespace Kernel {
  9. UNMAP_AFTER_INIT NonnullLockRefPtr<DeviceControlDevice> DeviceControlDevice::must_create()
  10. {
  11. auto device_control_device_or_error = DeviceManagement::try_create_device<DeviceControlDevice>();
  12. // FIXME: Find a way to propagate errors
  13. VERIFY(!device_control_device_or_error.is_error());
  14. return device_control_device_or_error.release_value();
  15. }
  16. bool DeviceControlDevice::can_read(OpenFileDescription const&, u64) const
  17. {
  18. return true;
  19. }
  20. UNMAP_AFTER_INIT DeviceControlDevice::DeviceControlDevice()
  21. : CharacterDevice(2, 10)
  22. {
  23. }
  24. UNMAP_AFTER_INIT DeviceControlDevice::~DeviceControlDevice() = default;
  25. ErrorOr<size_t> DeviceControlDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
  26. {
  27. auto device_event = DeviceManagement::the().dequeue_top_device_event({});
  28. if (!device_event.has_value())
  29. return 0;
  30. if (size < sizeof(DeviceEvent))
  31. return Error::from_errno(EOVERFLOW);
  32. size_t nread = 0;
  33. TRY(buffer.write(&device_event.value(), nread, sizeof(DeviceEvent)));
  34. nread += sizeof(DeviceEvent);
  35. return nread;
  36. }
  37. ErrorOr<void> DeviceControlDevice::ioctl(OpenFileDescription&, unsigned, Userspace<void*>)
  38. {
  39. return Error::from_errno(ENOTSUP);
  40. }
  41. }