2008-08-05 Bean <bean123ch@gmail.com>

* boot/i386/pc/pxeboot.S (_start): Use drive number 0x7F for pxe.

	* conf/i386-pc.rmk (kernel_img_HEADERS): Add machine/pxe.h.
	(pkglib_MODULES): Add pxe.mod and pxecmd.mod.
	(pxe_mod_SOURCES): New macro.
	(pxe_mod_CFLAGS): Likewise.
	(pxe_mod_LDFLAGS): Likewise.
	(pxecmd_mod_SOURCES): Likewise.
	(pxecmd_mod_CFLAGS): Likewise.
	(pxecmd_mod_LDFLAGS): Likewise.

	* kern/i386/pc/startup.S (grub_pxe_scan): New function.
	(grub_pxe_call): Likewise.

	* include/grub/disk.h (grub_disk_dev_id): Add GRUB_DISK_DEVICE_PXE_ID.

	* commands/i386/pc/pxecmd.c: New file.

	* disk/i386/pc/pxe.c: Likewise.

	* include/grub/i386/pc/pxe.h: Likewise.
This commit is contained in:
bean 2008-08-05 15:15:59 +00:00
parent 6977d49f98
commit 9e7007b310
10 changed files with 1048 additions and 9 deletions

View file

@ -2054,3 +2054,102 @@ FUNCTION(grub_vbe_bios_set_palette_data)
popl %ebx
popl %ebp
ret
pxe_rm_entry:
.long 0
/*
* struct grub_pxenv *grub_pxe_scan (void);
*/
FUNCTION(grub_pxe_scan)
pushl %ebp
pushl %ebx
xorl %ebx, %ebx
xorl %ecx, %ecx
call prot_to_real
.code16
pushw %es
movw $0x5650, %ax
int $0x1A
cmpw $0x564E, %ax
jnz 1f
cmpl $0x4E455850, %es:(%bx) /* PXEN(V+) */
jnz 1f
cmpw $0x201, %es:6(%bx) /* API version */
jb 1f
lesw %es:0x28(%bx), %bx /* !PXE structure */
cmpl $0x45585021, %es:(%bx) /* !PXE */
jnz 1f
movw %es, %cx
jmp 2f
1:
xorw %bx, %bx
xorw %cx, %cx
2:
popw %es
DATA32 call real_to_prot
.code32
xorl %eax, %eax
leal (%eax, %ecx, 4), %ecx
leal (%ebx, %ecx, 4), %eax /* eax = ecx * 16 + ebx */
orl %eax, %eax
jz 1f
movl 0x10(%eax), %ecx
movl %ecx, pxe_rm_entry
1:
popl %ebx
popl %ebp
ret
/*
* int grub_pxe_call (int func, void* data);
*/
FUNCTION(grub_pxe_call)
pushl %ebp
movl %esp, %ebp
pushl %esi
pushl %edi
pushl %ebx
movl %eax, %ecx
movl %edx, %eax
andl $0xF, %eax
shrl $4, %edx
shll $16, %edx
addl %eax, %edx
movl pxe_rm_entry, %ebx
call prot_to_real
.code16
pushl %ebx
pushl %edx
pushw %cx
movw %sp, %bx
lcall *%ss:6(%bx)
cld
addw $10, %sp
movw %ax, %cx
DATA32 call real_to_prot
.code32
movzwl %cx, %eax
popl %ebx
popl %edi
popl %esi
popl %ebp
ret