vmm: Silently accept another type of PIO out
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 5 Oct 2017 19:44:46 +0000 (15:44 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 5 Oct 2017 21:06:41 +0000 (17:06 -0400)
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/vmm/io.c

index bec6d8c..54b98da 100644 (file)
@@ -166,6 +166,7 @@ int io(struct guest_thread *vm_thread)
                printf("(out rax, edx): unhandled IO address dx @%p is 0x%x\n", ip8, edx);
                return 0;
        }
                printf("(out rax, edx): unhandled IO address dx @%p is 0x%x\n", ip8, edx);
                return 0;
        }
+       /* TODO: sort out these various OUT operations */
        // out %al, %dx
        if (*ip8 == 0xee) {
                vm_tf->tf_rip += 1;
        // out %al, %dx
        if (*ip8 == 0xee) {
                vm_tf->tf_rip += 1;
@@ -197,6 +198,16 @@ int io(struct guest_thread *vm_thread)
                printf("out al, dx: unhandled IO address dx @%p is 0x%x\n", ip8, edx);
                return 0;
        }
                printf("out al, dx: unhandled IO address dx @%p is 0x%x\n", ip8, edx);
                return 0;
        }
+       /* Silently accept OUT imm8, al */
+       if (*ip8 == 0xe6) {
+               vm_tf->tf_rip += 2;
+               return 0;
+       }
+       /* Silently accept OUT dx, ax with opcode size modifier */
+       if (*ip16 ==  0xef66) {
+               vm_tf->tf_rip += 2;
+               return 0;
+       }
        if (*ip8 == 0xec) {
                vm_tf->tf_rip += 1;
                //printf("configread8 ");
        if (*ip8 == 0xec) {
                vm_tf->tf_rip += 1;
                //printf("configread8 ");
@@ -214,11 +225,6 @@ int io(struct guest_thread *vm_thread)
                configread32(edx, &vm_tf->tf_rax);
                return 0;
        }
                configread32(edx, &vm_tf->tf_rax);
                return 0;
        }
-       /* Detects when something is written to the PIC. */
-       if (*ip8 == 0xe6) {
-               vm_tf->tf_rip += 2;
-               return 0;
-       }
        /* Detects when something is read from the PIC, so
         * a value signifying there is no PIC is given.
         */
        /* Detects when something is read from the PIC, so
         * a value signifying there is no PIC is given.
         */