diff options
Diffstat (limited to 'guest')
-rw-r--r-- | guest/guest16.S | 15 | ||||
-rw-r--r-- | guest/guest64.S | 8 |
2 files changed, 21 insertions, 2 deletions
diff --git a/guest/guest16.S b/guest/guest16.S index 4851694..9877ea9 100644 --- a/guest/guest16.S +++ b/guest/guest16.S @@ -6,11 +6,19 @@ mov dx, 0x1000 // Output port. lea si, [msg] // Address of string. mov cx, [msg_len] // Len of string. - rep outsb // Write ds:si to output port dx. + rep outsb // Write byte from ds:si to output port dx. - // Trigger `KVM_EXIT_MMIO` by writing to non mapped physical address. + // Trigger `KVM_EXIT_IO:KVM_EXIT_IO_IN` by reading byte to memory from input port. + mov dx, 0x1000 // Input port. + lea di, [in_dest] // Destination address. + insb // Read byte from input port dx to ds:di. + + // Trigger `KVM_EXIT_MMIO (w)` by writing to non mapped physical address. mov byte ptr ds:[0x2000], 0xaa + // Trigger `KVM_EXIT_MMIO (r)` by reading from non mapped physical address. + mov al, byte ptr ds:[0x2000] + // Trigger `KVM_EXIT_HLT`. hlt @@ -19,3 +27,6 @@ msg: .asciz "Hello from Real Mode!\n" msg_len: .2byte .-msg + +in_dest: + .byte 0x00 diff --git a/guest/guest64.S b/guest/guest64.S index 1862749..6629273 100644 --- a/guest/guest64.S +++ b/guest/guest64.S @@ -7,6 +7,11 @@ mov rcx, [rip + msg_len] // Len of string. rep outsb // Write ds:rsi to output port rdx. + // Trigger `KVM_EXIT_IO:KVM_EXIT_IO_IN` by reading byte to memory from input port. + mov dx, 0x1000 // Input port. + lea di, [in_dest] // Destination address. + insb // Read byte from input port dx to ds:di. + // Trigger `KVM_EXIT_HLT`. hlt @@ -15,3 +20,6 @@ msg: .asciz "Hello from Long Mode!\n" msg_len: .byte .-msg + +in_dest: + .byte 0x00 |