fix a typo and add the prototype for I/O port detection.
This commit is contained in:
parent
8ae7fd5f6f
commit
7c1baa7ada
3 changed files with 237 additions and 1 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
1999-10-24 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
|
||||||
|
|
||||||
|
Add the prototype of a function to probe I/O ports used for a
|
||||||
|
BIOS drive.
|
||||||
|
|
||||||
|
* stage2/asm.S [DEFINE_TRACK_INT13] (track_int13): New function.
|
||||||
|
[DEFINE_TRACK_INT13] (int1_handler): New interrupt handler for
|
||||||
|
the real mode.
|
||||||
|
[DEFINE_TRACK_INT13] (int3_handler): Likewise.
|
||||||
|
[DEFINE_TRACK_INT13] (io_map): New variable.
|
||||||
|
|
||||||
|
* stage2/builtins.c (quit_func) [!GRUB_UTIL]: Fix a typo.
|
||||||
|
|
||||||
1999-10-24 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
|
1999-10-24 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
|
||||||
|
|
||||||
The new GRUB manual becomes official.
|
The new GRUB manual becomes official.
|
||||||
|
|
223
stage2/asm.S
223
stage2/asm.S
|
@ -186,6 +186,229 @@ ENTRY(stop_floppy)
|
||||||
outb %al, %dx
|
outb %al, %dx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEFINE_TRACK_INT13
|
||||||
|
/*
|
||||||
|
* track_int13(int drive)
|
||||||
|
*
|
||||||
|
* Track the int13 handler to probe I/O address space.
|
||||||
|
*/
|
||||||
|
ENTRY(track_int13)
|
||||||
|
pushl %ebp
|
||||||
|
movl %esp, %ebp
|
||||||
|
|
||||||
|
pushl %edx
|
||||||
|
pushl %ebx
|
||||||
|
|
||||||
|
/* computer the linear address of int13 handler */
|
||||||
|
xorl %ebx, %ebx
|
||||||
|
xorl %eax, %eax
|
||||||
|
movw 0x13 * 4 + 2, %ax
|
||||||
|
shll $4, %eax
|
||||||
|
movw 0x13 * 4, %bx
|
||||||
|
addl %eax, %ebx
|
||||||
|
|
||||||
|
/* save the first intruction */
|
||||||
|
movb (%ebx), %al
|
||||||
|
movb %al, ABS(int13_first_instruction)
|
||||||
|
|
||||||
|
/* set the first instruction to int3 */
|
||||||
|
movb $0xCC, (%ebx)
|
||||||
|
|
||||||
|
/* replace the int1 handler */
|
||||||
|
pushl 0x1 * 4
|
||||||
|
movl $ABS(int1_handler), %eax
|
||||||
|
movl %eax, 0x1 * 4
|
||||||
|
|
||||||
|
/* replace the int3 handler */
|
||||||
|
pushl 0x3 * 4
|
||||||
|
movl $ABS(int3_handler), %eax
|
||||||
|
movl %eax, 0x3 * 4
|
||||||
|
|
||||||
|
/* read the MBR to call int13 successfully */
|
||||||
|
movw $SCRATCHSEG, %ax
|
||||||
|
movw %ax, %es
|
||||||
|
xorw %bx, %bx
|
||||||
|
movw $1, %cx
|
||||||
|
xorb %dl, %dl
|
||||||
|
movb 4(%ebp), %dl
|
||||||
|
|
||||||
|
call prot_to_real
|
||||||
|
|
||||||
|
.code16
|
||||||
|
movw $0x201, %ax
|
||||||
|
int $0x13
|
||||||
|
|
||||||
|
call real_to_prot
|
||||||
|
.code32
|
||||||
|
|
||||||
|
/* restore the int3 handler */
|
||||||
|
popl 0x3 * 4
|
||||||
|
|
||||||
|
/* restore the int1 handler */
|
||||||
|
popl 0x1 * 4
|
||||||
|
|
||||||
|
popl %ebx
|
||||||
|
popl %edx
|
||||||
|
popl %ebp
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if the next instruction is I/O, and if this is true, add the
|
||||||
|
* port into the io map.
|
||||||
|
*
|
||||||
|
* Note: Probably this will make the execution of int13 very slow.
|
||||||
|
*
|
||||||
|
* Note2: In this implementation, all we can know is I/O-mapped I/O. It
|
||||||
|
* is impossible to detect memory-mapped I/O.
|
||||||
|
*/
|
||||||
|
int1_handler:
|
||||||
|
.code16
|
||||||
|
|
||||||
|
pushw %bp
|
||||||
|
movw %sp, %bp
|
||||||
|
pushw %ds
|
||||||
|
pushw %ax
|
||||||
|
pushw %si
|
||||||
|
pushw %dx
|
||||||
|
|
||||||
|
/* IP */
|
||||||
|
movw 2(%bp), %si
|
||||||
|
/* CS */
|
||||||
|
movw 4(%bp), %ax
|
||||||
|
movw %ax, %ds
|
||||||
|
|
||||||
|
/* examine the next instruction */
|
||||||
|
1: lodsb (%si), %al
|
||||||
|
/* skip this code if it is a prefix */
|
||||||
|
cmpb $0x2E, %al
|
||||||
|
je 1b
|
||||||
|
cmpb $0x36, %al
|
||||||
|
je 1b
|
||||||
|
cmpb $0x3E, %al
|
||||||
|
je 1b
|
||||||
|
cmpb $0x26, %al
|
||||||
|
je 1b
|
||||||
|
cmpb $0x0F, %al
|
||||||
|
je 1b
|
||||||
|
cmpb $0x64, %al
|
||||||
|
jl 2f
|
||||||
|
cmpb $0x67, %al
|
||||||
|
jle 1b
|
||||||
|
2: cmpb 0xF0, %al
|
||||||
|
jl 3f
|
||||||
|
cmpb 0xF3, %al
|
||||||
|
jle 1b
|
||||||
|
|
||||||
|
3: /* check if this code is out* or in* */
|
||||||
|
|
||||||
|
/* ins? or outs? */
|
||||||
|
cmpb $0x6C, %al
|
||||||
|
jl 4f
|
||||||
|
cmpb $0x6F, %al
|
||||||
|
jle 5f
|
||||||
|
|
||||||
|
4: /* in? or out? (immediate operand version) */
|
||||||
|
cmpb $0xEC, %al
|
||||||
|
jl 6f
|
||||||
|
cmpb $0xEF, %al
|
||||||
|
jle 7f
|
||||||
|
|
||||||
|
6: /* in? or out? (register operand version) */
|
||||||
|
cmpb $0xE4, %al
|
||||||
|
jl 8f
|
||||||
|
cmpb $0xE7, %al
|
||||||
|
jg 8f
|
||||||
|
|
||||||
|
7: /* immediate has a port */
|
||||||
|
xorb %ah, %ah
|
||||||
|
lodsb (%si), %al
|
||||||
|
movw %ax, %dx
|
||||||
|
|
||||||
|
5: /* %dx has a port */
|
||||||
|
|
||||||
|
/* set %si to the io map */
|
||||||
|
movw $ABS(io_map), %si
|
||||||
|
|
||||||
|
|
||||||
|
9: /* check if the io map already has the port */
|
||||||
|
lodsw (%si), %ax
|
||||||
|
/* check if this is the end */
|
||||||
|
testw %ax, %ax
|
||||||
|
jz 1f
|
||||||
|
/* check if this matches the port */
|
||||||
|
cmpw %ax, %dx
|
||||||
|
jne 9b
|
||||||
|
/* if so, leave from this handler */
|
||||||
|
jmp 8f
|
||||||
|
|
||||||
|
1: /* add the port into the io map */
|
||||||
|
movw %dx, -2(%si)
|
||||||
|
|
||||||
|
8: /* restore registers */
|
||||||
|
popw %dx
|
||||||
|
popw %si
|
||||||
|
popw %ax
|
||||||
|
popw %ds
|
||||||
|
popw %bp
|
||||||
|
|
||||||
|
iret
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Just set the TF flag. This handler is necessary because any interrupt
|
||||||
|
* call clears the flag automatically.
|
||||||
|
*
|
||||||
|
* Note: we need not to clear this flag after the tracking explicitly,
|
||||||
|
* because int13 restores the original FLAGS.
|
||||||
|
*
|
||||||
|
* Note2: In this implementation, ignore the first instruction, because
|
||||||
|
* int1 is a trap but not a fault.
|
||||||
|
*/
|
||||||
|
int13_first_instruction:
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
int3_handler:
|
||||||
|
pushw %bp
|
||||||
|
movw %sp, %bp
|
||||||
|
pushw %ax
|
||||||
|
pushw %bx
|
||||||
|
pushw %ds
|
||||||
|
|
||||||
|
/* set the TF flag in the stack */
|
||||||
|
movw 6(%bp), %ax
|
||||||
|
orw $0x100, %ax
|
||||||
|
movw %ax, 4(%bp)
|
||||||
|
|
||||||
|
/* restore the first instruction */
|
||||||
|
movb ABS(int13_first_instruction), %al
|
||||||
|
movw 4(%bp), %bx
|
||||||
|
movw %bx, %ds
|
||||||
|
movw 2(%bp), %bx
|
||||||
|
movb %al, (%bx)
|
||||||
|
|
||||||
|
/* re-execute the first instruction */
|
||||||
|
decw %bx
|
||||||
|
movw %bx, 2(%bp)
|
||||||
|
|
||||||
|
popw %ds
|
||||||
|
popw %bx
|
||||||
|
popw %ax
|
||||||
|
popw %bp
|
||||||
|
|
||||||
|
iret
|
||||||
|
|
||||||
|
.code32
|
||||||
|
|
||||||
|
ENTRY(io_map)
|
||||||
|
#define IO_MAP_SIZE 0
|
||||||
|
.space (IO_MAP_SIZE + 1) * 2
|
||||||
|
|
||||||
|
#endif /* DEFINE_TRACK_INT13 */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* set_int15_handler(void)
|
* set_int15_handler(void)
|
||||||
*
|
*
|
||||||
|
|
|
@ -1779,7 +1779,7 @@ quit_func (char *arg, int flags)
|
||||||
/* Never reach here. */
|
/* Never reach here. */
|
||||||
return 0;
|
return 0;
|
||||||
#else /* ! GRUB_UTIL */
|
#else /* ! GRUB_UTIL */
|
||||||
errnum = ERR_UNRECOGINIZED;
|
errnum = ERR_UNRECOGNIZED;
|
||||||
return 1;
|
return 1;
|
||||||
#endif /* ! GRUB_UTIL */
|
#endif /* ! GRUB_UTIL */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue