.code16 .globl vm86_code_start .globl vm86_code_end #define GET_OFFSET(x) ((x) - vm86_code_start + 0x100) vm86_code_start: movw $GET_OFFSET(hello_world), %dx movb $0x09, %ah int $0x21 /* prepare int 0x90 vector */ xorw %ax, %ax movw %ax, %es es movw $GET_OFFSET(int90_test), 0x90 * 4 es movw %cs, 0x90 * 4 + 2 /* launch int 0x90 */ int $0x90 /* test IF support */ movw $GET_OFFSET(IF_msg), %dx movb $0x09, %ah int $0x21 pushf popw %dx movb $0xff, %ah int $0x21 cli pushf popw %dx movb $0xff, %ah int $0x21 sti pushfl popl %edx movb $0xff, %ah int $0x21 #if 0 movw $GET_OFFSET(IF_msg1), %dx movb $0x09, %ah int $0x21 pushf movw %sp, %bx andw $~0x200, (%bx) popf #else cli #endif pushf popw %dx movb $0xff, %ah int $0x21 pushfl movw %sp, %bx orw $0x200, (%bx) popfl pushfl popl %edx movb $0xff, %ah int $0x21 movb $0x00, %ah int $0x21 int90_test: pushf pop %dx movb $0xff, %ah int $0x21 movw %sp, %bx movw 4(%bx), %dx movb $0xff, %ah int $0x21 movw $GET_OFFSET(int90_msg), %dx movb $0x09, %ah int $0x21 iret int90_msg: .string "INT90 started\n$" hello_world: .string "Hello VM86 world\n$" IF_msg: .string "VM86 IF test\n$" IF_msg1: .string "If you see a diff here, your Linux kernel is buggy, please update to 2.4.20 kernel\n$" vm86_code_end: