Kernel: Add support for high bandwidth IO communication with VMWare

This commit is contained in:
Liav A 2020-02-05 02:54:52 +02:00 committed by Andreas Kling
parent 0c20f98c1c
commit 6070fe581b
Notes: sideshowbarker 2024-07-19 09:36:21 +09:00
3 changed files with 28 additions and 0 deletions

View File

@ -142,6 +142,18 @@ void VMWareBackdoor::disable_absolute_vmmouse()
m_vmmouse_absolute = false; 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) void VMWareBackdoor::send(VMWareCommand& command)
{ {
if (supported()) if (supported())

View File

@ -69,6 +69,8 @@ public:
void send(VMWareCommand& command); void send(VMWareCommand& command);
private: private:
void send_highbandwidth(VMWareCommand& command);
void get_highbandwidth(VMWareCommand& command);
VMWareBackdoor(); VMWareBackdoor();
bool detect_presence(); bool detect_presence();
bool detect_vmmouse(); bool detect_vmmouse();

View File

@ -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)); : "+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() inline void delay()
{ {
// ~3 microsecs // ~3 microsecs