VMWareMouseDevice.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Devices/HID/VMWareMouseDevice.h>
  7. #include <Kernel/Devices/VMWareBackdoor.h>
  8. #include <Kernel/Sections.h>
  9. namespace Kernel {
  10. UNMAP_AFTER_INIT RefPtr<VMWareMouseDevice> VMWareMouseDevice::try_to_initialize(const I8042Controller& ps2_controller)
  11. {
  12. if (!VMWareBackdoor::the())
  13. return {};
  14. if (!VMWareBackdoor::the()->vmmouse_is_absolute())
  15. return {};
  16. auto device = adopt_ref(*new VMWareMouseDevice(ps2_controller));
  17. if (device->initialize())
  18. return device;
  19. return {};
  20. }
  21. void VMWareMouseDevice::irq_handle_byte_read(u8)
  22. {
  23. VERIFY(VMWareBackdoor::the());
  24. VERIFY(VMWareBackdoor::the()->vmmouse_is_absolute());
  25. // We won't receive complete packets with the backdoor enabled,
  26. // we will only get one byte for each event, which we'll just
  27. // discard. If we were to wait until we *think* that we got a
  28. // full PS/2 packet then we would create a backlog in the VM
  29. // because we wouldn't read the appropriate number of mouse
  30. // packets from VMWareBackdoor.
  31. auto mouse_packet = VMWareBackdoor::the()->receive_mouse_packet();
  32. if (mouse_packet.has_value()) {
  33. m_entropy_source.add_random_event(mouse_packet.value());
  34. {
  35. SpinlockLocker lock(m_queue_lock);
  36. m_queue.enqueue(mouse_packet.value());
  37. }
  38. evaluate_block_conditions();
  39. }
  40. return;
  41. }
  42. VMWareMouseDevice::VMWareMouseDevice(const I8042Controller& ps2_controller)
  43. : PS2MouseDevice(ps2_controller)
  44. {
  45. }
  46. VMWareMouseDevice::~VMWareMouseDevice()
  47. {
  48. }
  49. }