1 .code16 2 .globl vm86_code_start 3 .globl vm86_code_end 4 5#define GET_OFFSET(x) ((x) - vm86_code_start + 0x100) 6 7vm86_code_start: 8 movw $GET_OFFSET(hello_world), %dx 9 movb $0x09, %ah 10 int $0x21 11 12 /* prepare int 0x90 vector */ 13 xorw %ax, %ax 14 movw %ax, %es 15 es movw $GET_OFFSET(int90_test), 0x90 * 4 16 es movw %cs, 0x90 * 4 + 2 17 18 /* launch int 0x90 */ 19 20 int $0x90 21 22 /* test IF support */ 23 movw $GET_OFFSET(IF_msg), %dx 24 movb $0x09, %ah 25 int $0x21 26 27 pushf 28 popw %dx 29 movb $0xff, %ah 30 int $0x21 31 32 cli 33 pushf 34 popw %dx 35 movb $0xff, %ah 36 int $0x21 37 38 sti 39 pushfl 40 popl %edx 41 movb $0xff, %ah 42 int $0x21 43 44#if 0 45 movw $GET_OFFSET(IF_msg1), %dx 46 movb $0x09, %ah 47 int $0x21 48 49 pushf 50 movw %sp, %bx 51 andw $~0x200, (%bx) 52 popf 53#else 54 cli 55#endif 56 57 pushf 58 popw %dx 59 movb $0xff, %ah 60 int $0x21 61 62 pushfl 63 movw %sp, %bx 64 orw $0x200, (%bx) 65 popfl 66 67 pushfl 68 popl %edx 69 movb $0xff, %ah 70 int $0x21 71 72 movb $0x00, %ah 73 int $0x21 74 75int90_test: 76 pushf 77 pop %dx 78 movb $0xff, %ah 79 int $0x21 80 81 movw %sp, %bx 82 movw 4(%bx), %dx 83 movb $0xff, %ah 84 int $0x21 85 86 movw $GET_OFFSET(int90_msg), %dx 87 movb $0x09, %ah 88 int $0x21 89 iret 90 91int90_msg: 92 .string "INT90 started\n$" 93 94hello_world: 95 .string "Hello VM86 world\n$" 96 97IF_msg: 98 .string "VM86 IF test\n$" 99 100IF_msg1: 101 .string "If you see a diff here, your Linux kernel is buggy, please update to 2.4.20 kernel\n$" 102 103vm86_code_end: 104