mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 08:35:07 +00:00

Instead of doing so in the constructor, let's do immediately after the constructor, so we can safely pass a reference of a Device, so the SysFSDeviceComponent constructor can use that object to identify whether it's a block device or a character device. This allows to us to not hold a device in SysFSDeviceComponent with a RefPtr. Also, we also call the before_removing method in both SlavePTY::unref and File::unref, so because Device has that method being overrided, it can ensure the device is removed always cleanly.
57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
/*
|
|
* Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <Kernel/Devices/HID/VMWareMouseDevice.h>
|
|
#include <Kernel/Devices/VMWareBackdoor.h>
|
|
#include <Kernel/Sections.h>
|
|
|
|
namespace Kernel {
|
|
|
|
UNMAP_AFTER_INIT RefPtr<VMWareMouseDevice> VMWareMouseDevice::try_to_initialize(const I8042Controller& ps2_controller)
|
|
{
|
|
if (!VMWareBackdoor::the())
|
|
return {};
|
|
if (!VMWareBackdoor::the()->vmmouse_is_absolute())
|
|
return {};
|
|
auto mouse_device_or_error = try_create_device<VMWareMouseDevice>(ps2_controller);
|
|
// FIXME: Find a way to propagate errors
|
|
VERIFY(!mouse_device_or_error.is_error());
|
|
if (mouse_device_or_error.value()->initialize())
|
|
return mouse_device_or_error.release_value();
|
|
return {};
|
|
}
|
|
|
|
void VMWareMouseDevice::irq_handle_byte_read(u8)
|
|
{
|
|
VERIFY(VMWareBackdoor::the());
|
|
VERIFY(VMWareBackdoor::the()->vmmouse_is_absolute());
|
|
// We won't receive complete packets with the backdoor enabled,
|
|
// we will only get one byte for each event, which we'll just
|
|
// discard. If we were to wait until we *think* that we got a
|
|
// full PS/2 packet then we would create a backlog in the VM
|
|
// because we wouldn't read the appropriate number of mouse
|
|
// packets from VMWareBackdoor.
|
|
auto mouse_packet = VMWareBackdoor::the()->receive_mouse_packet();
|
|
if (mouse_packet.has_value()) {
|
|
m_entropy_source.add_random_event(mouse_packet.value());
|
|
{
|
|
SpinlockLocker lock(m_queue_lock);
|
|
m_queue.enqueue(mouse_packet.value());
|
|
}
|
|
evaluate_block_conditions();
|
|
}
|
|
return;
|
|
}
|
|
|
|
VMWareMouseDevice::VMWareMouseDevice(const I8042Controller& ps2_controller)
|
|
: PS2MouseDevice(ps2_controller)
|
|
{
|
|
}
|
|
VMWareMouseDevice::~VMWareMouseDevice()
|
|
{
|
|
}
|
|
|
|
}
|