diff --git a/Kernel/Devices/VMWareBackdoor.cpp b/Kernel/Devices/VMWareBackdoor.cpp index 91b3f3775f4..b63a3cff1e9 100644 --- a/Kernel/Devices/VMWareBackdoor.cpp +++ b/Kernel/Devices/VMWareBackdoor.cpp @@ -142,6 +142,18 @@ void VMWareBackdoor::disable_absolute_vmmouse() m_vmmouse_absolute = false; } +void VMWareBackdoor::send_highbandwidth(VMWareCommand& command) +{ + if (supported()) + IO::vmware_highbandwidth_send(command); +} + +void VMWareBackdoor::get_highbandwidth(VMWareCommand& command) +{ + if (supported()) + IO::vmware_highbandwidth_get(command); +} + void VMWareBackdoor::send(VMWareCommand& command) { if (supported()) diff --git a/Kernel/Devices/VMWareBackdoor.h b/Kernel/Devices/VMWareBackdoor.h index c7803987a68..df0f325960d 100644 --- a/Kernel/Devices/VMWareBackdoor.h +++ b/Kernel/Devices/VMWareBackdoor.h @@ -69,6 +69,8 @@ public: void send(VMWareCommand& command); private: + void send_highbandwidth(VMWareCommand& command); + void get_highbandwidth(VMWareCommand& command); VMWareBackdoor(); bool detect_presence(); bool detect_vmmouse(); diff --git a/Kernel/IO.h b/Kernel/IO.h index a1503c66495..f72db719825 100644 --- a/Kernel/IO.h +++ b/Kernel/IO.h @@ -99,6 +99,20 @@ inline void vmware_out(VMWareCommand& command) : "+a"(command.ax), "+b"(command.bx), "+c"(command.cx), "+d"(command.dx), "+S"(command.si), "+D"(command.di)); } +inline void vmware_highbandwidth_send(VMWareCommand& command) { + + command.magic = VMWARE_MAGIC; + command.port = VMWARE_PORT_HIGHBANDWIDTH; + + asm volatile("cld; rep; outsb" : "+a"(command.ax), "+b"(command.bx), "+c"(command.cx), "+d"(command.dx), "+S"(command.si), "+D"(command.di)); +} + +inline void vmware_highbandwidth_get(VMWareCommand& command) { + command.magic = VMWARE_MAGIC; + command.port = VMWARE_PORT_HIGHBANDWIDTH; + asm volatile("cld; rep; insb" : "+a"(command.ax), "+b"(command.bx), "+c"(command.cx), "+d"(command.dx), "+S"(command.si), "+D"(command.di)); +} + inline void delay() { // ~3 microsecs