|  | .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: |