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