|
|
|
@ -9,7 +9,7 @@
|
|
|
|
|
*/
|
|
|
|
|
/* fn __do_bios_int(regs: &mut BiosIntRegs) -> u8 */
|
|
|
|
|
GLOBL __do_bios_int
|
|
|
|
|
pushal // '1 v
|
|
|
|
|
pushal // '1 (4 -> 36)
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Move the `regs` parameter into %ebp. `call` pushes one longword
|
|
|
|
@ -18,21 +18,24 @@ GLOBL __do_bios_int
|
|
|
|
|
*/
|
|
|
|
|
mov 36(%esp), %ebp
|
|
|
|
|
/* now load all registers with their desired values */
|
|
|
|
|
mov (%ebp), %ax
|
|
|
|
|
mov 2(%ebp), %cx
|
|
|
|
|
mov 4(%ebp), %dx
|
|
|
|
|
mov 6(%ebp), %bx
|
|
|
|
|
mov 8(%ebp), %si
|
|
|
|
|
mov 10(%ebp), %di
|
|
|
|
|
mov 24(%ebp), %eax
|
|
|
|
|
push %eax /* %ds and %es */ // '2 (36 -> 40)
|
|
|
|
|
mov (%ebp), %eax
|
|
|
|
|
mov 4(%ebp), %ecx
|
|
|
|
|
mov 8(%ebp), %edx
|
|
|
|
|
mov 12(%ebp), %ebx
|
|
|
|
|
mov 16(%ebp), %esi
|
|
|
|
|
mov 20(%ebp), %edi
|
|
|
|
|
|
|
|
|
|
push %ebp // '2 v
|
|
|
|
|
|
|
|
|
|
push %eax // '3 v
|
|
|
|
|
push %edx // '4 v
|
|
|
|
|
push %eax // '3 (40 -> 44)
|
|
|
|
|
push %edx // '4 (44 -> 48)
|
|
|
|
|
call prot_to_real
|
|
|
|
|
.code16
|
|
|
|
|
pop %edx // '4 ^
|
|
|
|
|
pop %eax // '3 ^
|
|
|
|
|
pop %edx // '4 (44 <- 48)
|
|
|
|
|
pop %eax // '3 (40 <- 44)
|
|
|
|
|
|
|
|
|
|
pop %es // '2 (38 <- 40)
|
|
|
|
|
pop %ds // '2 (36 <- 38)
|
|
|
|
|
|
|
|
|
|
/* call that polymorphism! */
|
|
|
|
|
.byte 0xcd /* opcode for `int imm8` */
|
|
|
|
@ -41,27 +44,34 @@ GLOBL __bios_int_number, object
|
|
|
|
|
|
|
|
|
|
/* be careful not to touch EFLAGS now because that's our return value */
|
|
|
|
|
|
|
|
|
|
push %eax // '3 v
|
|
|
|
|
push %edx // '4 v
|
|
|
|
|
pushfl // '5 v
|
|
|
|
|
push %ds // '2 (36 -> 38)
|
|
|
|
|
push %es // '2 (38 -> 40)
|
|
|
|
|
|
|
|
|
|
push %eax // '3 (40 -> 44)
|
|
|
|
|
push %edx // '4 (44 -> 48)
|
|
|
|
|
pushfl // '5 (48 -> 52)
|
|
|
|
|
call real_to_prot
|
|
|
|
|
.code32
|
|
|
|
|
popfl // '5 ^
|
|
|
|
|
pop %edx // '4 ^
|
|
|
|
|
pop %eax // '3 ^
|
|
|
|
|
popfl // '5 (48 <- 52)
|
|
|
|
|
pop %edx // '4 (44 <- 48)
|
|
|
|
|
pop %eax // '3 (40 <- 44)
|
|
|
|
|
|
|
|
|
|
pop %ebp // '2 ^
|
|
|
|
|
/* the BIOS call might have trashed %ebp, restore it */
|
|
|
|
|
mov 40(%esp), %ebp
|
|
|
|
|
|
|
|
|
|
mov %ax, (%ebp)
|
|
|
|
|
mov %cx, 2(%ebp)
|
|
|
|
|
mov %dx, 4(%ebp)
|
|
|
|
|
mov %bx, 6(%ebp)
|
|
|
|
|
mov %si, 8(%ebp)
|
|
|
|
|
mov %di, 10(%ebp)
|
|
|
|
|
mov %eax, (%ebp)
|
|
|
|
|
pop %eax // '2 (36 <- 40)
|
|
|
|
|
mov %eax, 24(%ebp)
|
|
|
|
|
mov %ecx, 4(%ebp)
|
|
|
|
|
mov %edx, 8(%ebp)
|
|
|
|
|
mov %ebx, 12(%ebp)
|
|
|
|
|
mov %esi, 16(%ebp)
|
|
|
|
|
mov %edi, 20(%ebp)
|
|
|
|
|
|
|
|
|
|
popal // '1 ^
|
|
|
|
|
popal // '1 (4 <- 36)
|
|
|
|
|
setc %al
|
|
|
|
|
/* this is not really required, but just in case */
|
|
|
|
|
movzbl %al, %eax
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
ret //'0 (0 <- 4)
|
|
|
|
|
END __do_bios_int
|
|
|
|
|