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