1/* 2 * FreeLoader 3 * Copyright (C) 1998-2002 Brian Palmer <brianp@sginet.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 20 .text 21 .code16 22 23#define ASM 24#include <arch.h> 25 26 27Int386_REGS: 28 29Int386_eax: 30 .long 0 31Int386_ebx: 32 .long 0 33Int386_ecx: 34 .long 0 35Int386_edx: 36 .long 0 37 38Int386_esi: 39 .long 0 40Int386_edi: 41 .long 0 42 43Int386_ds: 44 .word 0 45Int386_es: 46 .word 0 47Int386_fs: 48 .word 0 49Int386_gs: 50 .word 0 51 52Int386_eflags: 53 .long 0 54 55Int386_vector: 56 .long 0 57Int386_regsin: 58 .long 0 59Int386_regsout: 60 .long 0 61 62/* 63 * int Int386(int ivec, REGS* in, REGS* out); 64 */ 65EXTERN(_Int386) 66 .code32 67 68 /* Get the function parameters */ 69 movl 0x04(%esp),%eax 70 movl %eax,Int386_vector 71 movb %al,Int386_vector_opcode 72 movl 0x08(%esp),%eax 73 movl %eax,Int386_regsin 74 movl 0x0c(%esp),%eax 75 movl %eax,Int386_regsout 76 77 /* Save all registers + segment registers */ 78 pushw %ds 79 pushw %es 80 pushw %fs 81 pushw %gs 82 pushal 83 84 /* Copy the input regs to our variables */ 85 movl $Int386_REGS,%edi 86 movl Int386_regsin,%esi 87 movl $0x24,%ecx 88 rep 89 movsb 90 91 call switch_to_real 92 .code16 93 94 /* Setup the registers */ 95 movw %cs:Int386_ds,%ax 96 movw %ax,%ds /* DS register */ 97 movw %cs:Int386_es,%ax 98 movw %ax,%es /* ES register */ 99 movw %cs:Int386_fs,%ax 100 movw %ax,%fs /* FS register */ 101 movw %cs:Int386_gs,%ax 102 movw %ax,%gs /* GS register */ 103 104 movl %cs:Int386_eax,%eax /* EAX register */ 105 movl %cs:Int386_ebx,%ebx /* EBX register */ 106 movl %cs:Int386_ecx,%ecx /* ECX register */ 107 movl %cs:Int386_edx,%edx /* EDX register */ 108 109 movl %cs:Int386_esi,%esi /* ESI register */ 110 movl %cs:Int386_edi,%edi /* EDI register */ 111 112 /* Do not set the flags register */ 113 /* only return its value in regsout */ 114 //pushl Int386_eflags 115 //popfl /* EFLAGS register */ 116 117 /* Call the interrupt vector */ 118 /*int Int386_vector*/ 119Int386_int_opcode: 120 .byte 0xcd 121Int386_vector_opcode: 122 .byte 0x00 123 124 /* Save the registers */ 125 movl %eax,%cs:Int386_eax /* EAX register */ 126 movl %ebx,%cs:Int386_ebx /* EBX register */ 127 movl %ecx,%cs:Int386_ecx /* ECX register */ 128 movl %edx,%cs:Int386_edx /* EDX register */ 129 130 movl %esi,%cs:Int386_esi /* ESI register */ 131 movl %edi,%cs:Int386_edi /* EDI register */ 132 133 movw %ds,%ax /* DS register */ 134 movw %ax,%cs:Int386_ds 135 movw %es,%ax /* ES register */ 136 movw %ax,%cs:Int386_es 137 movw %fs,%ax /* FS register */ 138 movw %ax,%cs:Int386_fs 139 movw %gs,%ax /* GS register */ 140 movw %ax,%cs:Int386_gs 141 142 pushf 143 popw %cs:Int386_eflags /* EFLAGS register */ 144 145 call switch_to_prot 146 .code32 147 148 /* Copy the variables to the output regs */ 149 movl $Int386_REGS,%esi 150 movl Int386_regsout,%edi 151 movl $0x24,%ecx 152 rep 153 movsb 154 155 /* Restore segment and all other registers */ 156 157 158 popal 159 popw %gs 160 popw %fs 161 popw %es 162 popw %ds 163 164 /* Get return value */ 165 movl Int386_eax,%eax 166 167 ret 168