diff options
Diffstat (limited to 'qemu/roms/ipxe/src/arch/i386/prefix')
21 files changed, 0 insertions, 5647 deletions
diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/bootpart.S b/qemu/roms/ipxe/src/arch/i386/prefix/bootpart.S deleted file mode 100644 index 6d0c6034a..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/bootpart.S +++ /dev/null @@ -1,218 +0,0 @@ -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -#define BOOT_SEG 0x07c0 -#define EXEC_SEG 0x0100 -#define STACK_SEG 0x0200 -#define STACK_SIZE 0x2000 - - .text - .arch i386 - .section ".prefix", "awx", @progbits - .code16 - -/* - * Find active partition - * - * Parameters: - * %dl : BIOS drive number - * %bp : Active partition handler routine - */ -find_active_partition: - /* Set up stack at STACK_SEG:STACK_SIZE */ - movw $STACK_SEG, %ax - movw %ax, %ss - movw $STACK_SIZE, %sp - - /* Relocate self to EXEC_SEG */ - pushw $BOOT_SEG - popw %ds - pushw $EXEC_SEG - popw %es - xorw %si, %si - xorw %di, %di - movw $0x200, %cx - rep movsb - ljmp $EXEC_SEG, $1f -1: pushw %ds - popw %es - pushw %cs - popw %ds - - /* Check for LBA extensions */ - movb $0x41, %ah - movw $0x55aa, %bx - stc - int $0x13 - jc 1f - cmpw $0xaa55, %bx - jne 1f - movw $read_lba, read_sectors -1: - /* Read and process root partition table */ - xorb %dh, %dh - movw $0x0001, %cx - xorl %esi, %esi - xorl %edi, %edi - call process_table - - /* Print failure message */ - movw $10f, %si - jmp boot_error -10: .asciz "Could not locate active partition\r\n" - -/* - * Print failure message and boot next device - * - * Parameters: - * %si : Failure string - */ -boot_error: - cld - movw $0x0007, %bx - movb $0x0e, %ah -1: lodsb - testb %al, %al - je 99f - int $0x10 - jmp 1b -99: /* Boot next device */ - int $0x18 - -/* - * Process partition table - * - * Parameters: - * %dl : BIOS drive number - * %dh : Head - * %cl : Sector (bits 0-5), high two bits of cylinder (bits 6-7) - * %ch : Low eight bits of cylinder - * %esi:%edi : LBA address - * %bp : Active partition handler routine - * - * Returns: - * CF set on error - */ -process_table: - pushal - call read_boot_sector - jc 99f - movw $446, %bx -1: call process_partition - addw $16, %bx - cmpw $510, %bx - jne 1b -99: popal - ret - -/* - * Process partition - * - * Parameters: - * %dl : BIOS drive number - * %dh : Head - * %cl : Sector (bits 0-5), high two bits of cylinder (bits 6-7) - * %ch : Low eight bits of cylinder - * %esi:%edi : LBA address - * %bx : Offset within partition table - * %bp : Active partition handler routine - */ -process_partition: - pushal - /* Load C/H/S values from partition entry */ - movb %es:1(%bx), %dh - movw %es:2(%bx), %cx - /* Update LBA address from partition entry */ - addl %es:8(%bx), %edi - adcl $0, %esi - /* Check active flag */ - testb $0x80, %es:(%bx) - jz 1f - call read_boot_sector - jc 99f - jmp *%bp -1: /* Check for extended partition */ - movb %es:4(%bx), %al - cmpb $0x05, %al - je 2f - cmpb $0x0f, %al - je 2f - cmpb $0x85, %al - jne 99f -2: call process_table -99: popal - /* Reload original partition table */ - call read_boot_sector - ret - -/* - * Read single sector to %es:0000 and verify 0x55aa signature - * - * Parameters: - * %dl : BIOS drive number - * %dh : Head - * %cl : Sector (bits 0-5), high two bits of cylinder (bits 6-7) - * %ch : Low eight bits of cylinder - * %esi:%edi : LBA address - * - * Returns: - * CF set on error - */ -read_boot_sector: - pushw %ax - movw $1, %ax - call *read_sectors - jc 99f - cmpw $0xaa55, %es:(510) - je 99f - stc -99: popw %ax - ret - -/* - * Read sectors to %es:0000 - * - * Parameters: - * %dl : BIOS drive number - * %dh : Head - * %cl : Sector (bits 0-5), high two bits of cylinder (bits 6-7) - * %ch : Low eight bits of cylinder - * %esi:%edi : LBA address - * %ax : Number of sectors (max 127) - * - * Returns: - * CF set on error - */ -read_sectors: .word read_chs - -read_chs: - /* Read sectors using C/H/S address */ - pushal - xorw %bx, %bx - movb $0x02, %ah - stc - int $0x13 - sti - popal - ret - -read_lba: - /* Read sectors using LBA address */ - pushal - movw %ax, (lba_desc + 2) - pushw %es - popw (lba_desc + 6) - movl %edi, (lba_desc + 8) - movl %esi, (lba_desc + 12) - movw $lba_desc, %si - movb $0x42, %ah - int $0x13 - popal - ret - -lba_desc: - .byte 0x10 - .byte 0 - .word 1 - .word 0x0000 - .word 0x0000 - .long 0, 0 diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/dskprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/dskprefix.S deleted file mode 100644 index 7aa017ccd..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/dskprefix.S +++ /dev/null @@ -1,383 +0,0 @@ -/* NOTE: this boot sector contains instructions that need at least an 80186. - * Yes, as86 has a bug somewhere in the valid instruction set checks. - * - */ - -/* floppyload.S Copyright (C) 1991, 1992 Linus Torvalds - * modified by Drew Eckhardt - * modified by Bruce Evans (bde) - * - * floppyprefix.S is loaded at 0x0000:0x7c00 by the bios-startup routines. - * - * It then loads the system at SYSSEG<<4, using BIOS interrupts. - * - * The loader has been made as simple as possible, and continuous read errors - * will result in a unbreakable loop. Reboot by hand. It loads pretty fast by - * getting whole tracks at a time whenever possible. - */ - -FILE_LICENCE ( GPL2_ONLY ) - -.equ BOOTSEG, 0x07C0 /* original address of boot-sector */ - -.equ SYSSEG, 0x1000 /* system loaded at SYSSEG<<4 */ - - .org 0 - .arch i386 - .text - .section ".prefix", "ax", @progbits - .code16 - .globl _dsk_start -_dsk_start: - - jmp $BOOTSEG, $go /* reload cs:ip to match relocation addr */ -go: - movw $0x2000-12, %di /* 0x2000 is arbitrary value >= length */ - /* of bootsect + room for stack + 12 for */ - /* saved disk parm block */ - - movw $BOOTSEG, %ax - movw %ax,%ds - movw %ax,%es - movw %ax,%ss /* put stack at BOOTSEG:0x4000-12. */ - movw %di,%sp - -/* Many BIOS's default disk parameter tables will not recognize multi-sector - * reads beyond the maximum sector number specified in the default diskette - * parameter tables - this may mean 7 sectors in some cases. - * - * Since single sector reads are slow and out of the question, we must take care - * of this by creating new parameter tables (for the first disk) in RAM. We - * will set the maximum sector count to 36 - the most we will encounter on an - * ED 2.88. High doesn't hurt. Low does. - * - * Segments are as follows: ds=es=ss=cs - BOOTSEG - */ - - xorw %cx,%cx - movw %cx,%es /* access segment 0 */ - movw $0x78, %bx /* 0:bx is parameter table address */ - pushw %ds /* save ds */ -/* 0:bx is parameter table address */ - ldsw %es:(%bx),%si /* loads ds and si */ - - movw %ax,%es /* ax is BOOTSECT (loaded above) */ - movb $6, %cl /* copy 12 bytes */ - cld - pushw %di /* keep a copy for later */ - rep - movsw /* ds:si is source, es:di is dest */ - popw %di - - movb $36,%es:4(%di) - - movw %cx,%ds /* access segment 0 */ - xchgw %di,(%bx) - movw %es,%si - xchgw %si,2(%bx) - popw %ds /* restore ds */ - movw %di, dpoff /* save old parameters */ - movw %si, dpseg /* to restore just before finishing */ - pushw %ds - popw %es /* reload es */ - -/* Note that es is already set up. Also cx is 0 from rep movsw above. */ - - xorb %ah,%ah /* reset FDC */ - xorb %dl,%dl - int $0x13 - -/* Get disk drive parameters, specifically number of sectors/track. - * - * It seems that there is no BIOS call to get the number of sectors. Guess - * 36 sectors if sector 36 can be read, 18 sectors if sector 18 can be read, - * 15 if sector 15 can be read. Otherwise guess 9. - */ - - movw $disksizes, %si /* table of sizes to try */ - -probe_loop: - lodsb - cbtw /* extend to word */ - movw %ax, sectors - cmpw $disksizes+4, %si - jae got_sectors /* if all else fails, try 9 */ - xchgw %cx,%ax /* cx = track and sector */ - xorw %dx,%dx /* drive 0, head 0 */ - movw $0x0200, %bx /* address after boot sector */ - /* (512 bytes from origin, es = cs) */ - movw $0x0201, %ax /* service 2, 1 sector */ - int $0x13 - jc probe_loop /* try next value */ - -got_sectors: - movw $msg1end-msg1, %cx - movw $msg1, %si - call print_str - -/* ok, we've written the Loading... message, now we want to load the system */ - - movw $SYSSEG, %ax - movw %ax,%es /* segment of SYSSEG<<4 */ - pushw %es - call read_it - -/* This turns off the floppy drive motor, so that we enter the kernel in a - * known state, and don't have to worry about it later. - */ - movw $0x3f2, %dx - xorb %al,%al - outb %al,%dx - - call print_nl - pop %es /* = SYSSEG */ - -/* Restore original disk parameters */ - movw $0x78, %bx - movw dpoff, %di - movw dpseg, %si - xorw %ax,%ax - movw %ax,%ds - movw %di,(%bx) - movw %si,2(%bx) - - /* Everything now loaded. %es = SYSSEG, so %es:0000 points to - * start of loaded image. - */ - - /* Jump to loaded copy */ - ljmp $SYSSEG, $start_runtime - -endseg: .word SYSSEG - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "ADDW" - .long endseg - .long 16 - .long 0 - .previous - -/* This routine loads the system at address SYSSEG<<4, making sure no 64kB - * boundaries are crossed. We try to load it as fast as possible, loading whole - * tracks whenever we can. - * - * in: es - starting address segment (normally SYSSEG) - */ -read_it: - movw $0,sread /* load whole image including prefix */ - movw %es,%ax - testw $0x0fff, %ax -die: jne die /* es must be at 64kB boundary */ - xorw %bx,%bx /* bx is starting address within segment */ -rp_read: - movw %es,%ax - movw %bx,%dx - movb $4, %cl - shrw %cl,%dx /* bx is always divisible by 16 */ - addw %dx,%ax - cmpw endseg, %ax /* have we loaded all yet? */ - jb ok1_read - ret -ok1_read: - movw sectors, %ax - subw sread, %ax - movw %ax,%cx - shlw $9, %cx - addw %bx,%cx - jnc ok2_read - je ok2_read - xorw %ax,%ax - subw %bx,%ax - shrw $9, %ax -ok2_read: - call read_track - movw %ax,%cx - addw sread, %ax - cmpw sectors, %ax - jne ok3_read - movw $1, %ax - subw head, %ax - jne ok4_read - incw track -ok4_read: - movw %ax, head - xorw %ax,%ax -ok3_read: - movw %ax, sread - shlw $9, %cx - addw %cx,%bx - jnc rp_read - movw %es,%ax - addb $0x10, %ah - movw %ax,%es - xorw %bx,%bx - jmp rp_read - -read_track: - pusha - pushw %ax - pushw %bx - pushw %bp /* just in case the BIOS is buggy */ - movw $0x0e2e, %ax /* 0x2e = . */ - movw $0x0007, %bx - int $0x10 - popw %bp - popw %bx - popw %ax - - movw track, %dx - movw sread, %cx - incw %cx - movb %dl,%ch - movw head, %dx - movb %dl,%dh - andw $0x0100, %dx - movb $2, %ah - - pushw %dx /* save for error dump */ - pushw %cx - pushw %bx - pushw %ax - - int $0x13 - jc bad_rt - addw $8, %sp - popa - ret - -bad_rt: pushw %ax /* save error code */ - call print_all /* ah = error, al = read */ - - xorb %ah,%ah - xorb %dl,%dl - int $0x13 - - addw $10, %sp - popa - jmp read_track - -/* print_all is for debugging purposes. It will print out all of the registers. - * The assumption is that this is called from a routine, with a stack frame like - * dx - * cx - * bx - * ax - * error - * ret <- sp - */ - -print_all: - call print_nl /* nl for readability */ - movw $5, %cx /* error code + 4 registers */ - movw %sp,%bp - -print_loop: - pushw %cx /* save count left */ - - cmpb $5, %cl - jae no_reg /* see if register name is needed */ - - movw $0x0007, %bx /* page 0, attribute 7 (normal) */ - movw $0xe05+0x41-1, %ax - subb %cl,%al - int $0x10 - - movb $0x58, %al /* 'X' */ - int $0x10 - - movb $0x3A, %al /* ':' */ - int $0x10 - -no_reg: - addw $2, %bp /* next register */ - call print_hex /* print it */ - movb $0x20, %al /* print a space */ - int $0x10 - popw %cx - loop print_loop - call print_nl /* nl for readability */ - ret - -print_str: - movw $0x0007, %bx /* page 0, attribute 7 (normal) */ - movb $0x0e, %ah /* write char, tty mode */ -prloop: - lodsb - int $0x10 - loop prloop - ret - -print_nl: - movw $0x0007, %bx /* page 0, attribute 7 (normal) */ - movw $0xe0d, %ax /* CR */ - int $0x10 - movb $0xa, %al /* LF */ - int $0x10 - ret - -/* print_hex prints the word pointed to by ss:bp in hexadecimal. */ - -print_hex: - movw (%bp),%dx /* load word into dx */ - movb $4, %cl - movb $0x0e, %ah /* write char, tty mode */ - movw $0x0007, %bx /* page 0, attribute 7 (normal) */ - call print_digit - call print_digit - call print_digit -/* fall through */ -print_digit: - rol %cl,%dx /* rotate so that lowest 4 bits are used */ - movb $0x0f, %al /* mask for nybble */ - andb %dl,%al - addb $0x90, %al /* convert al to ascii hex (four instructions) */ - daa - adcb $0x40, %al - daa - int $0x10 - ret - -sread: .word 0 /* sectors read of current track */ -head: .word 0 /* current head */ -track: .word 0 /* current track */ - -sectors: - .word 0 - -dpseg: .word 0 -dpoff: .word 0 - -disksizes: - .byte 36,18,15,9 - -msg1: - .ascii "Loading ROM image" -msg1end: - - .org 510, 0 - .word 0xAA55 - -start_runtime: - /* Install iPXE */ - call install - - /* Set up real-mode stack */ - movw %bx, %ss - movw $_estack16, %sp - - /* Jump to .text16 segment */ - pushw %ax - pushw $1f - lret - .section ".text16", "awx", @progbits -1: - pushl $main - pushw %cs - call prot_call - popl %ecx /* discard */ - - /* Uninstall iPXE */ - call uninstall - - /* Boot next device */ - int $0x18 - diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/exeprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/exeprefix.S deleted file mode 100644 index 5c648d51d..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/exeprefix.S +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2011 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements. - * - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -/* Initial temporary stack size */ -#define EXE_STACK_SIZE 0x400 - -/* Temporary decompression area (avoid DOS high memory area) */ -#define EXE_DECOMPRESS_ADDRESS 0x110000 - -/* Fields within the Program Segment Prefix */ -#define PSP_CMDLINE_LEN 0x80 -#define PSP_CMDLINE_START 0x81 - - .text - .arch i386 - .org 0 - .code16 - .section ".prefix", "awx", @progbits - -signature: - /* "MZ" signature */ - .ascii "MZ" - -last_block: - /* Number of bytes in last block that are really used */ - .word 0 - -blocks: - /* Number of 512-byte blocks */ - .word 0 - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "ADDW" - .long blocks - .long 512 - .long 0 - .previous - -num_reloc: - /* Number of relocation entries stored after the header */ - .word 0 - -header_pgh: - /* Number of paragraphs in the header */ - .word ( ( _exe_start - signature ) / 16 ) - -min_bss_pgh: - /* Minimum number of paragraphs of additional (BSS) memory */ - .word ( EXE_STACK_SIZE / 16 ) - -max_bss_pgh: - /* Maximum number of paragraphs of additional (BSS) memory */ - .word ( EXE_STACK_SIZE / 16 ) - -init_ss: - /* Initial stack segment (relative to start of executable) */ - .word -( ( _exe_start - signature ) / 16 ) - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "ADDW" - .long init_ss - .long 16 - .long 0 - .previous - -init_sp: - /* Initial stack pointer */ - .word EXE_STACK_SIZE - -checksum: - /* Checksum (ignored) */ - .word 0 - -init_ip: - /* Initial instruction pointer */ - .word _exe_start - -init_cs: - /* Initial code segment (relative to start of executable) */ - .word -( ( _exe_start - signature ) / 16 ) - -reloc_table: - /* Relocation table offset */ - .word 0 - -overlay: - /* Overlay number */ - .word 0 - - .align 16, 0 - - .globl _exe_start -_exe_start: - /* Install iPXE. Use a fixed temporary decompression area to - * avoid trashing the DOS high memory area. - */ - call alloc_basemem - xorl %esi, %esi - movl $EXE_DECOMPRESS_ADDRESS, %edi - orl $0xffffffff, %ebp /* Allow arbitrary relocation */ - call install_prealloc - - /* Set up real-mode stack */ - movw %bx, %ss - movw $_estack16, %sp - - /* Jump to .text16 segment */ - pushw %ax - pushw $1f - lret - .section ".text16", "awx", @progbits -1: - /* Terminate command line with a NUL */ - movzbw PSP_CMDLINE_LEN, %si - movb $0, PSP_CMDLINE_START(%si) - - /* Calculate command line physical address */ - xorl %esi, %esi - movw %ds, %si - shll $4, %esi - addl $PSP_CMDLINE_START, %esi - - /* Set up %ds for access to .data16 */ - movw %bx, %ds - - /* Record command line address */ - movl %esi, cmdline_phys - - /* Run iPXE */ - pushl $main - pushw %cs - call prot_call - popl %ecx /* discard */ - - /* Uninstall iPXE */ - call uninstall - - /* Exit back to DOS. This is very unlikely to work */ - movw $0x4c00, %ax - int $0x21 diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/hdprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/hdprefix.S deleted file mode 100644 index 1d012d80b..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/hdprefix.S +++ /dev/null @@ -1,111 +0,0 @@ -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - - .text - .arch i386 - .section ".prefix", "awx", @progbits - .code16 - .org 0 - .globl _hd_start -_hd_start: - - movw $load_image, %bp - jmp find_active_partition - -#include "bootpart.S" - -load_image: - /* Get disk geometry */ - pushal - pushw %es - movb $0x08, %ah - int $0x13 - jc load_failed - movb %cl, max_sector - movb %dh, max_head - popw %es - popal - -1: /* Read to end of current track */ - movb %cl, %al - negb %al - addb max_sector, %al - incb %al - andb $0x3f, %al - movzbl %al, %eax - call *read_sectors - jc load_failed - - /* Update %es */ - movw %es, %bx - shll $5, %eax - addw %ax, %bx - movw %bx, %es - shrl $5, %eax - - /* Update LBA address */ - addl %eax, %edi - adcl $0, %esi - - /* Update CHS address */ - andb $0xc0, %cl - orb $0x01, %cl - incb %dh - cmpb max_head, %dh - jbe 2f - xorb %dh, %dh - incb %ch - jnc 2f - addb $0xc0, %cl -2: - /* Loop until whole image is read */ - subl %eax, load_length - ja 1b - ljmp $BOOT_SEG, $start_image - -max_sector: - .byte 0 -max_head: - .byte 0 -load_length: - .long 0 - - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "ADDL" - .long load_length - .long 512 - .long 0 - .previous - - -load_failed: - movw $10f, %si - jmp boot_error -10: .asciz "Could not load iPXE\r\n" - - .org 510 - .byte 0x55, 0xaa - -start_image: - /* Install iPXE */ - call install - - /* Set up real-mode stack */ - movw %bx, %ss - movw $_estack16, %sp - - /* Jump to .text16 segment */ - pushw %ax - pushw $1f - lret - .section ".text16", "awx", @progbits -1: - pushl $main - pushw %cs - call prot_call - popl %ecx /* discard */ - - /* Uninstall iPXE */ - call uninstall - - /* Boot next device */ - int $0x18 diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/isaromprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/isaromprefix.S deleted file mode 100644 index fb49819ee..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/isaromprefix.S +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements. - * - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -#define BUSTYPE "ISAR" -#define _rom_start _isarom_start -#include "romprefix.S" diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/kkkpxeprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/kkkpxeprefix.S deleted file mode 100644 index 6e43cd26a..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/kkkpxeprefix.S +++ /dev/null @@ -1,17 +0,0 @@ -/***************************************************************************** - * PXE prefix that keeps the whole PXE stack present and provides an exit hook - * - * This prefix is essentially intended solely for the case of ipxelinux.0 - ***************************************************************************** - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -/* Provide the PXENV_FILE_EXIT_HOOK API call */ -REQUIRING_SYMBOL ( _kkkpxe_start ) -REQUIRE_OBJECT ( pxe_exit_hook ) - -#define PXELOADER_KEEP_UNDI -#define PXELOADER_KEEP_PXE -#define _pxe_start _kkkpxe_start -#include "pxeprefix.S" diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/kkpxeprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/kkpxeprefix.S deleted file mode 100644 index 3c17dbdb1..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/kkpxeprefix.S +++ /dev/null @@ -1,11 +0,0 @@ -/***************************************************************************** - * PXE prefix that keeps the whole PXE stack present - ***************************************************************************** - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -#define PXELOADER_KEEP_UNDI -#define PXELOADER_KEEP_PXE -#define _pxe_start _kkpxe_start -#include "pxeprefix.S" diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/kpxeprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/kpxeprefix.S deleted file mode 100644 index 200006d83..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/kpxeprefix.S +++ /dev/null @@ -1,10 +0,0 @@ -/***************************************************************************** - * PXE prefix that keep the UNDI portion of the PXE stack present - ***************************************************************************** - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -#define PXELOADER_KEEP_UNDI -#define _pxe_start _kpxe_start -#include "pxeprefix.S" diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/libprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/libprefix.S deleted file mode 100644 index 7d5c1ed53..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/libprefix.S +++ /dev/null @@ -1,1016 +0,0 @@ -/* - * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements. - * - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - - .arch i386 - -/* Image compression enabled */ -#define COMPRESS 1 - -/* Protected mode flag */ -#define CR0_PE 1 - -/* Allow for DBG()-style messages within libprefix */ -#ifdef NDEBUG - .macro progress message - .endm -#else - .macro progress message - pushfl - pushw %ds - pushw %si - pushw %di - pushw %cs - popw %ds - xorw %di, %di - movw $progress_\@, %si - call print_message - popw %di - popw %si - popw %ds - popfl - .section ".prefix.data", "aw", @progbits -progress_\@: - .asciz "\message" - .size progress_\@, . - progress_\@ - .previous - .endm -#endif - -/***************************************************************************** - * Utility function: print character (with LF -> LF,CR translation) - * - * Parameters: - * %al : character to print - * %ds:di : output buffer (or %di=0 to print to console) - * Returns: - * %ds:di : next character in output buffer (if applicable) - ***************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 - .globl print_character -print_character: - /* Preserve registers */ - pushw %ax - pushw %bx - pushw %bp - /* If %di is non-zero, write character to buffer and exit */ - testw %di, %di - jz 1f - movb %al, %ds:(%di) - incw %di - jmp 3f -1: /* Print character */ - movw $0x0007, %bx /* page 0, attribute 7 (normal) */ - movb $0x0e, %ah /* write char, tty mode */ - cmpb $0x0a, %al /* '\n'? */ - jne 2f - int $0x10 - movb $0x0d, %al -2: int $0x10 - /* Restore registers and return */ -3: popw %bp - popw %bx - popw %ax - ret - .size print_character, . - print_character - -/***************************************************************************** - * Utility function: print space - * - * Parameters: - * %ds:di : output buffer (or %di=0 to print to console) - * Returns: - * %ds:di : next character in output buffer (if applicable) - ***************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 - .globl print_space -print_space: - /* Preserve registers */ - pushw %ax - /* Print space */ - movb $( ' ' ), %al - call print_character - /* Restore registers and return */ - popw %ax - ret - .size print_space, . - print_space - -/***************************************************************************** - * Utility function: print a NUL-terminated string - * - * Parameters: - * %ds:si : string to print - * %ds:di : output buffer (or %di=0 to print to console) - * Returns: - * %ds:si : character after terminating NUL - * %ds:di : next character in output buffer (if applicable) - ***************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 - .globl print_message -print_message: - /* Preserve registers */ - pushw %ax - /* Print string */ -1: lodsb - testb %al, %al - je 2f - call print_character - jmp 1b -2: /* Restore registers and return */ - popw %ax - ret - .size print_message, . - print_message - -/***************************************************************************** - * Utility functions: print hex digit/byte/word/dword - * - * Parameters: - * %al (low nibble) : digit to print - * %al : byte to print - * %ax : word to print - * %eax : dword to print - * %ds:di : output buffer (or %di=0 to print to console) - * Returns: - * %ds:di : next character in output buffer (if applicable) - ***************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 - .globl print_hex_dword -print_hex_dword: - rorl $16, %eax - call print_hex_word - rorl $16, %eax - /* Fall through */ - .size print_hex_dword, . - print_hex_dword - .globl print_hex_word -print_hex_word: - xchgb %al, %ah - call print_hex_byte - xchgb %al, %ah - /* Fall through */ - .size print_hex_word, . - print_hex_word - .globl print_hex_byte -print_hex_byte: - rorb $4, %al - call print_hex_nibble - rorb $4, %al - /* Fall through */ - .size print_hex_byte, . - print_hex_byte - .globl print_hex_nibble -print_hex_nibble: - /* Preserve registers */ - pushw %ax - /* Print digit (technique by Norbert Juffa <norbert.juffa@amd.com> */ - andb $0x0f, %al - cmpb $10, %al - sbbb $0x69, %al - das - call print_character - /* Restore registers and return */ - popw %ax - ret - .size print_hex_nibble, . - print_hex_nibble - -/***************************************************************************** - * Utility function: print PCI bus:dev.fn - * - * Parameters: - * %ax : PCI bus:dev.fn to print - * %ds:di : output buffer (or %di=0 to print to console) - * Returns: - * %ds:di : next character in output buffer (if applicable) - ***************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 - .globl print_pci_busdevfn -print_pci_busdevfn: - /* Preserve registers */ - pushw %ax - /* Print bus */ - xchgb %al, %ah - call print_hex_byte - /* Print ":" */ - movb $( ':' ), %al - call print_character - /* Print device */ - movb %ah, %al - shrb $3, %al - call print_hex_byte - /* Print "." */ - movb $( '.' ), %al - call print_character - /* Print function */ - movb %ah, %al - andb $0x07, %al - call print_hex_nibble - /* Restore registers and return */ - popw %ax - ret - .size print_pci_busdevfn, . - print_pci_busdevfn - -/***************************************************************************** - * Utility function: clear current line - * - * Parameters: - * %ds:di : output buffer (or %di=0 to print to console) - * Returns: - * %ds:di : next character in output buffer (if applicable) - ***************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 - .globl print_kill_line -print_kill_line: - /* Preserve registers */ - pushw %ax - pushw %cx - /* Print CR */ - movb $( '\r' ), %al - call print_character - /* Print 79 spaces */ - movw $79, %cx -1: call print_space - loop 1b - /* Print CR */ - call print_character - /* Restore registers and return */ - popw %cx - popw %ax - ret - .size print_kill_line, . - print_kill_line - -/**************************************************************************** - * copy_bytes - * - * Copy bytes - * - * Parameters: - * %ds:esi : source address - * %es:edi : destination address - * %ecx : length - * Returns: - * %ds:esi : next source address - * %es:edi : next destination address - * Corrupts: - * None - **************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 -copy_bytes: - pushl %ecx - rep addr32 movsb - popl %ecx - ret - .size copy_bytes, . - copy_bytes - -/**************************************************************************** - * zero_bytes - * - * Zero bytes - * - * Parameters: - * %es:edi : destination address - * %ecx : length - * Returns: - * %es:edi : next destination address - * Corrupts: - * None - **************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 -zero_bytes: - pushl %ecx - pushw %ax - xorw %ax, %ax - rep addr32 stosb - popw %ax - popl %ecx - ret - .size zero_bytes, . - zero_bytes - -/**************************************************************************** - * process_bytes - * - * Call memcpy()-like function - * - * Parameters: - * %esi : source physical address - * %edi : destination physical address - * %ecx : length - * %bx : memcpy()-like function to call, passing parameters: - * %ds:esi : source address - * %es:edi : destination address - * %ecx : length - * and returning: - * %ds:esi : next source address - * %es:edi : next destination address - * Returns: - * %esi : next source physical address - * %edi : next destination physical address - * Corrupts: - * None - **************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 -process_bytes: - -#ifndef KEEP_IT_REAL - - /* Preserve registers */ - pushl %eax - pushl %ebp - - /* Construct GDT on stack (since .prefix may not be writable) */ - .equ PM_DS, 0x18 /* Flat data segment */ - pushl $0x00cf9300 - pushl $0x0000ffff - .equ PM_SS, 0x10 /* Stack segment based at %ss:0000 */ - pushl $0x008f0930 - pushw %ss - pushw $0xffff - .equ PM_CS, 0x08 /* Code segment based at %cs:0000 */ - pushl $0x008f09b0 - pushw %cs - pushw $0xffff - pushl $0 /* Base and length */ - pushw %ss - pushw $0x1f - movzwl %sp, %ebp - shll $4, 0x02(%bp) - addl %ebp, 0x02(%bp) - shll $4, 0x0a(%bp) - shll $4, 0x12(%bp) - subw $8, %sp - sgdt -8(%bp) - - /* Switch to protected mode */ - pushw %gs - pushw %fs - pushw %es - pushw %ds - pushw %ss - pushw %cs - pushw $2f - cli - data32 lgdt (%bp) - movl %cr0, %eax - orb $CR0_PE, %al - movl %eax, %cr0 - ljmp $PM_CS, $1f -1: movw $PM_SS, %ax - movw %ax, %ss - movw $PM_DS, %ax - movw %ax, %ds - movw %ax, %es - movw %ax, %fs - movw %ax, %gs - -#ifdef NDEBUG - /* Call memcpy()-like function */ - call *%bx -#endif - - /* Return to (flat) real mode */ - movl %cr0, %eax - andb $0!CR0_PE, %al - movl %eax, %cr0 - lret -2: /* lret will ljmp to here */ - popw %ss - popw %ds - popw %es - popw %fs - popw %gs - -#ifndef NDEBUG - /* Call memcpy()-like function in flat real mode (to allow for - * debug output via INT 10). - */ - pushw %ds - pushw %es - xorw %ax, %ax - movw %ax, %ds - movw %ax, %es - call *%bx - popw %es - popw %ds -#endif - - /* Restore GDT */ - data32 lgdt -8(%bp) - addw $( 8 /* saved GDT */ + ( PM_DS + 8 ) /* GDT on stack */ ), %sp - - /* Restore registers and return */ - popl %ebp - popl %eax - ret - -#else /* KEEP_IT_REAL */ - - /* Preserve registers */ - pushl %eax - pushw %ds - pushw %es - - /* Convert %esi and %edi to %ds:esi and %es:edi */ - shrl $4, %esi - movw %si, %ds - xorw %si, %si - shll $4, %esi - shrl $4, %edi - movw %di, %es - xorw %di, %di - shll $4, %edi - - /* Call memcpy()-like function */ - call *%bx - - /* Convert %ds:esi and %es:edi back to physical addresses */ - xorl %eax, %eax - movw %ds, %ax - shll $4, %eax - addl %eax, %esi - xorl %eax, %eax - movw %es, %ax - shll $4, %eax - addl %eax, %edi - - /* Restore registers and return */ - popw %es - popw %ds - popl %eax - ret - -#endif /* KEEP_IT_REAL */ - - .size process_bytes, . - process_bytes - -/**************************************************************************** - * install_block - * - * Install block to specified address - * - * Parameters: - * %esi : source physical address (must be a multiple of 16) - * %edi : destination physical address (must be a multiple of 16) - * %ecx : length of (decompressed) data - * %edx : total length of block (including any uninitialised data portion) - * Returns: - * %esi : next source physical address (will be a multiple of 16) - * %edi : next destination physical address (will be a multiple of 16) - * Corrupts: - * none - **************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 -install_block: - /* Preserve registers */ - pushl %ecx - pushw %bx - - /* Decompress (or copy) source to destination */ -#if COMPRESS - movw $decompress16, %bx -#else - movw $copy_bytes, %bx -#endif - call process_bytes - - /* Zero .bss portion */ - negl %ecx - addl %edx, %ecx - movw $zero_bytes, %bx - call process_bytes - - /* Round up %esi and %edi to start of next blocks */ - addl $0xf, %esi - andl $~0xf, %esi - addl $0xf, %edi - andl $~0xf, %edi - - /* Restore registers and return */ - popw %bx - popl %ecx - ret - .size install_block, . - install_block - -/**************************************************************************** - * alloc_basemem - * - * Allocate space for .text16 and .data16 from top of base memory. - * Memory is allocated using the BIOS free base memory counter at - * 0x40:13. - * - * Parameters: - * none - * Returns: - * %ax : .text16 segment address - * %bx : .data16 segment address - * Corrupts: - * none - **************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 - .globl alloc_basemem -alloc_basemem: - /* Preserve registers */ - pushw %fs - - /* FBMS => %ax as segment address */ - pushw $0x40 - popw %fs - movw %fs:0x13, %ax - shlw $6, %ax - - /* Calculate .data16 segment address */ - subw $_data16_memsz_pgh, %ax - pushw %ax - - /* Calculate .text16 segment address. Round down to ensure - * low bits are zero, to speed up mode transitions under KVM. - */ - subw $_text16_memsz_pgh, %ax - andb $~0x03, %al - pushw %ax - - /* Update FBMS */ - shrw $6, %ax - movw %ax, %fs:0x13 - - /* Retrieve .text16 and .data16 segment addresses */ - popw %ax - popw %bx - - /* Restore registers and return */ - popw %fs - ret - .size alloc_basemem, . - alloc_basemem - -/**************************************************************************** - * free_basemem - * - * Free space allocated with alloc_basemem. - * - * Parameters: - * none (.text16 segment address is implicit in %cs) - * Returns: - * %ax : 0 if successfully freed - * Corrupts: - * none - **************************************************************************** - */ - .section ".text16", "ax", @progbits - .code16 - .globl free_basemem -free_basemem: - /* Preserve registers */ - pushw %fs - pushw %ax - - /* Check FBMS counter */ - movw %cs, %ax - shrw $6, %ax - pushw $0x40 - popw %fs - cmpw %ax, %fs:0x13 - jne 1f - - /* Check hooked interrupt count */ - cmpw $0, %cs:hooked_bios_interrupts - jne 1f - - /* OK to free memory */ - movw %cs, %ax - addw $_text16_memsz_pgh, %ax - addw $_data16_memsz_pgh, %ax - shrw $6, %ax - movw %ax, %fs:0x13 - xorw %ax, %ax - -1: /* Restore registers and return */ - popw %ax - popw %fs - ret - .size free_basemem, . - free_basemem - - .section ".text16.data", "aw", @progbits - .globl hooked_bios_interrupts -hooked_bios_interrupts: - .word 0 - .size hooked_bios_interrupts, . - hooked_bios_interrupts - -/**************************************************************************** - * install - * - * Install all text and data segments. - * - * Parameters: - * none - * Returns: - * %ax : .text16 segment address - * %bx : .data16 segment address - * Corrupts: - * none - **************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 - .globl install -install: - progress "install:\n" - /* Preserve registers */ - pushl %esi - pushl %edi - pushl %ebp - /* Allocate space for .text16 and .data16 */ - call alloc_basemem - /* Image source = %cs:0000 */ - xorl %esi, %esi - /* Image destination = default */ - xorl %edi, %edi - /* Allow arbitrary relocation */ - orl $0xffffffff, %ebp - /* Install text and data segments */ - call install_prealloc - /* Restore registers and return */ - popl %ebp - popl %edi - popl %esi - ret - .size install, . - install - -/**************************************************************************** - * install_prealloc - * - * Install all text and data segments. - * - * Parameters: - * %ax : .text16 segment address - * %bx : .data16 segment address - * %esi : Image source physical address (or zero for %cs:0000) - * %edi : Decompression temporary area physical address (or zero for default) - * %ebp : Maximum end address for relocation - * - 0xffffffff for no maximum - * - 0x00000000 to inhibit use of INT 15,e820 and INT 15,e801 - * Corrupts: - * none - **************************************************************************** - */ - .section ".prefix.lib", "awx", @progbits - .code16 - .globl install_prealloc -install_prealloc: - progress "install_prealloc:\n" - /* Save registers on external stack */ - pushal - pushw %ds - pushw %es - cld /* Sanity: clear the direction flag asap */ - - /* Switch to temporary stack in .bss16 */ - pushw %ss - popw %ds - movl %esp, %ecx - movw %bx, %ss - movl $_data16_memsz, %esp - pushw %ds - pushl %ecx - - /* Set up %ds for (read-only) access to .prefix */ - pushw %cs - popw %ds - - /* Save decompression temporary area physical address */ - pushl %edi - - /* Install .text16.early and calculate %ecx as offset to next block */ - progress " .text16.early\n" - pushl %esi - xorl %esi, %esi - movw %cs, %si - shll $4, %esi - pushl %esi /* Save original %cs:0000 */ - addl $_text16_early_lma, %esi - movzwl %ax, %edi - shll $4, %edi - movl $_text16_early_filesz, %ecx - movl $_text16_early_memsz, %edx - call install_block /* .text16.early */ - popl %ecx /* Calculate offset to next block */ - subl %esi, %ecx - negl %ecx - popl %esi - -#ifndef KEEP_IT_REAL - - /* Access high memory by enabling the A20 gate. (We will - * already have 4GB segment limits as a result of calling - * install_block.) - */ - progress " access_highmem\n" - pushw %cs - pushw $1f - pushw %ax - pushw $access_highmem - lret -1: /* Die if we could not access high memory */ - jnc 3f - movw $a20_death_message, %si - xorw %di, %di - call print_message -2: jmp 2b - .section ".prefix.data", "aw", @progbits -a20_death_message: - .asciz "\nHigh memory inaccessible - cannot continue\n" - .size a20_death_message, . - a20_death_message - .previous -3: -#endif - - /* Open payload (which may not yet be in memory) */ - progress " open_payload\n" - pushw %cs - pushw $1f - pushw %ax - pushw $open_payload - lret -1: /* Die if we could not access the payload */ - jnc 3f - xorw %di, %di - movl %esi, %eax - call print_hex_dword - call print_space - movl %ecx, %eax - call print_hex_dword - movw $payload_death_message, %si - call print_message -2: /* Halt system */ - cli - hlt - jmp 2b - .section ".prefix.data", "aw", @progbits -payload_death_message: - .asciz "\nPayload inaccessible - cannot continue\n" - .size payload_death_message, . - payload_death_message - .previous -3: - - /* Calculate physical address of payload (i.e. first source) */ - testl %esi, %esi - jnz 1f - movw %cs, %si - shll $4, %esi -1: addl %ecx, %esi - - /* Install .text16.late and .data16 */ - progress " .text16.late\n" - movl $_text16_late_filesz, %ecx - movl $_text16_late_memsz, %edx - call install_block /* .text16.late */ - progress " .data16\n" - movzwl %bx, %edi - shll $4, %edi - movl $_data16_filesz, %ecx - movl $_data16_filesz, %edx /* do not zero our temporary stack */ - call install_block /* .data16 */ - - /* Set up %ds for access to .data16 */ - movw %bx, %ds - - /* Restore decompression temporary area physical address */ - popl %edi - -#ifndef KEEP_IT_REAL - - /* Find a suitable decompression temporary area, if none specified */ - pushl %eax - testl %edi, %edi - jnz 1f - /* Use INT 15,88 to find the highest available address via INT - * 15,88. This limits us to around 64MB, which should avoid - * all of the POST-time memory map failure modes. - */ - movb $0x88, %ah - int $0x15 - movw %ax, %di - addl $0x400, %edi - subl $_textdata_memsz_kb, %edi - shll $10, %edi - /* Sanity check: if we have ended up below 1MB, use 1MB */ - cmpl $0x100000, %edi - jae 1f - movl $0x100000, %edi -1: popl %eax - - /* Install .text and .data to temporary area in high memory, - * prior to reading the E820 memory map and relocating - * properly. - */ - progress " .textdata\n" - pushl %edi - movl $_textdata_filesz, %ecx - movl $_textdata_memsz, %edx - call install_block - popl %edi - -#endif /* KEEP_IT_REAL */ - - /* Switch back to original stack and zero .bss16 */ - addr32 lss %ss:(%esp), %esp - pushl %edi - pushw %es - movw %bx, %es - movl $_data16_filesz, %edi - movl $_data16_memsz, %ecx - subl %edi, %ecx - call zero_bytes - popw %es - popl %edi - -#ifndef KEEP_IT_REAL - - /* Initialise librm at current location */ - progress " init_librm\n" - movw %ax, (init_librm_vector+2) - lcall *init_librm_vector - - /* Inhibit INT 15,e820 and INT 15,e801 if applicable */ - testl %ebp, %ebp - jnz 1f - incb memmap_post - decl %ebp -1: - /* Call relocate() to determine target address for relocation. - * relocate() will return with %esi, %edi and %ecx set up - * ready for the copy to the new location. - */ - progress " relocate\n" - movw %ax, (prot_call_vector+2) - pushl $relocate - lcall *prot_call_vector - popl %edx /* discard */ - - /* Copy code to new location */ - progress " copy\n" - pushl %edi - pushw %bx - movw $copy_bytes, %bx - call process_bytes - popw %bx - popl %edi - - /* Initialise librm at new location */ - progress " init_librm\n" - lcall *init_librm_vector - -#else /* KEEP_IT_REAL */ - - /* Initialise libkir */ - movw %ax, (init_libkir_vector+2) - lcall *init_libkir_vector - -#endif /* KEEP_IT_REAL */ - - /* Close access to payload */ - progress " close_payload\n" - movw %ax, (close_payload_vector+2) - lcall *close_payload_vector - - /* Restore registers */ - popw %es - popw %ds - popal - ret - .size install_prealloc, . - install_prealloc - - /* Vectors for far calls to .text16 functions. Must be in - * .data16, since .prefix may not be writable. - */ - .section ".data16", "aw", @progbits -#ifdef KEEP_IT_REAL -init_libkir_vector: - .word init_libkir - .word 0 - .size init_libkir_vector, . - init_libkir_vector -#else -init_librm_vector: - .word init_librm - .word 0 - .size init_librm_vector, . - init_librm_vector -prot_call_vector: - .word prot_call - .word 0 - .size prot_call_vector, . - prot_call_vector -#endif -close_payload_vector: - .word close_payload - .word 0 - .size close_payload_vector, . - close_payload_vector - - /* Dummy routines to open and close payload */ - .section ".text16.early.data", "aw", @progbits - .weak open_payload - .weak close_payload -open_payload: -close_payload: - clc - lret - .size open_payload, . - open_payload - .size close_payload, . - close_payload - -/**************************************************************************** - * uninstall - * - * Uninstall all text and data segments. - * - * Parameters: - * none (.text16 segment address is implicit in %cs) - * Returns: - * none - * Corrupts: - * none - **************************************************************************** - */ - .section ".text16", "ax", @progbits - .code16 - .globl uninstall -uninstall: - call free_basemem - ret - .size uninstall, . - uninstall - - - - /* File split information for the compressor */ -#if COMPRESS -#define PACK_OR_COPY "PACK" -#else -#define PACK_OR_COPY "COPY" -#endif - .section ".zinfo", "a", @progbits - .ascii "COPY" - .long _prefix_lma - .long _prefix_filesz - .long _max_align - .ascii PACK_OR_COPY - .long _text16_early_lma - .long _text16_early_filesz - .long _max_align - .ascii "PAYL" - .long 0 - .long 0 - .long _payload_align - .ascii "COPY" - .long _pprefix_lma - .long _pprefix_filesz - .long _max_align - .ascii PACK_OR_COPY - .long _text16_late_lma - .long _text16_late_filesz - .long _max_align - .ascii PACK_OR_COPY - .long _data16_lma - .long _data16_filesz - .long _max_align - .ascii PACK_OR_COPY - .long _textdata_lma - .long _textdata_filesz - .long _max_align - - .weak _payload_align - .equ _payload_align, 1 diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/lkrnprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/lkrnprefix.S deleted file mode 100644 index 64135e14b..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/lkrnprefix.S +++ /dev/null @@ -1,236 +0,0 @@ -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -#define BZI_LOAD_HIGH_ADDR 0x100000 - - .text - .arch i386 - .code16 - .section ".prefix", "ax", @progbits - .globl _lkrn_start -_lkrn_start: - -/***************************************************************************** - * - * Kernel header - * - * We place our prefix (i.e. our .prefix and .text16.early sections) - * within the bzImage real-mode portion which gets loaded at - * 1000:0000, and our payload (i.e. everything else) within the - * bzImage protected-mode portion which gets loaded at 0x100000 - * upwards. - * - */ - - .org 0x1f1 -setup_sects: - .byte -1 /* Allow for initial "boot sector" */ - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "ADHL" - .long setup_sects - .long 512 - .long 0 - .previous -root_flags: - .word 0 -syssize: - .long 0 - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "ADPL" - .long syssize - .long 16 - .long 0 - .previous -ram_size: - .word 0 -vid_mode: - .word 0 -root_dev: - .word 0 -boot_flag: - .word 0xaa55 -jump: - /* Manually specify a two-byte jmp instruction here rather - * than leaving it up to the assembler. - */ - .byte 0xeb, ( setup - header ) -header: - .byte 'H', 'd', 'r', 'S' -version: - .word 0x0207 /* 2.07 */ -realmode_swtch: - .long 0 -start_sys: - .word 0 -kernel_version: - .word version_string - 0x200 -type_of_loader: - .byte 0 -loadflags: - .byte 0x01 /* LOADED_HIGH */ -setup_move_size: - .word 0 -code32_start: - .long 0 -ramdisk_image: - .long 0 -ramdisk_size: - .long 0 -bootsect_kludge: - .long 0 -heap_end_ptr: - .word 0 -ext_loader_ver: - .byte 0 -ext_loader_type: - .byte 0 -cmd_line_ptr: - .long 0 -initrd_addr_max: - .long 0xffffffff -kernel_alignment: - .long 0 -relocatable_kernel: - .byte 0 -min_alignment: - .byte 0 -xloadflags: - .word 0 -cmdline_size: - .long 0x7ff -hardware_subarch: - .long 0 -hardware_subarch_data: - .byte 0, 0, 0, 0, 0, 0, 0, 0 - -version_string: - .asciz VERSION - -/***************************************************************************** - * - * Setup code - * - */ - -setup: - /* Fix up code segment */ - pushw %ds - pushw $1f - lret -1: - /* Set up stack just below 0x7c00 and clear direction flag */ - xorw %ax, %ax - movw %ax, %ss - movw $0x7c00, %sp - cld - - /* Retrieve command-line pointer */ - movl cmd_line_ptr, %edx - testl %edx, %edx - jz no_cmd_line - - /* Set up %es:%di to point to command line */ - movl %edx, %edi - andl $0xf, %edi - rorl $4, %edx - movw %dx, %es - - /* Find length of command line */ - pushw %di - movw $0xffff, %cx - repnz scasb - notw %cx - popw %si - - /* Make space for command line on stack */ - movw %sp, %di - subw %cx, %di - andw $~0xf, %di - movw %di, %sp - - /* Copy command line to stack */ - pushw %ds - pushw %es - popw %ds - pushw %ss - popw %es - rep movsb - popw %ds - - /* Store new command-line pointer */ - movzwl %sp, %edx -no_cmd_line: - - /* Calculate maximum relocation address */ - movl ramdisk_image, %ebp - testl %ebp, %ebp - jnz 1f - orl $0xffffffff, %ebp /* Allow arbitrary relocation if no initrd */ -1: - /* Install iPXE */ - call alloc_basemem - xorl %esi, %esi - xorl %edi, %edi - call install_prealloc - - /* Set up real-mode stack */ - movw %bx, %ss - movw $_estack16, %sp - - /* Jump to .text16 segment */ - pushw %ax - pushw $1f - lret - .section ".text16", "awx", @progbits -1: - /* Retrieve initrd pointer and size */ - movl ramdisk_image, %ebp - movl ramdisk_size, %ecx - - /* Set up %ds for access to .data16 */ - movw %bx, %ds - - /* Store command-line pointer */ - movl %edx, cmdline_phys - - /* Store initrd pointer and size */ - movl %ebp, initrd_phys - movl %ecx, initrd_len - - /* Run iPXE */ - pushl $main - pushw %cs - call prot_call - popl %ecx /* discard */ - - /* Uninstall iPXE */ - call uninstall - - /* Boot next device */ - int $0x18 - -/***************************************************************************** - * - * Open payload (called by libprefix) - * - * Parameters: - * %ds:0000 : Prefix - * %esi : Buffer for copy of image source (or zero if no buffer available) - * %ecx : Expected offset within buffer of first payload block - * Returns: - * %esi : Valid image source address (buffered or unbuffered) - * %ecx : Actual offset within buffer of first payload block - * CF set on error - */ - - .section ".text16.early", "awx", @progbits - .globl open_payload -open_payload: - - /* Our payload will always end up at BZI_LOAD_HIGH_ADDR */ - movl $BZI_LOAD_HIGH_ADDR, %esi - xorl %ecx, %ecx - lret - - /* Payload must be aligned to a whole number of setup sectors */ - .globl _payload_align - .equ _payload_align, 512 diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/mbr.S b/qemu/roms/ipxe/src/arch/i386/prefix/mbr.S deleted file mode 100644 index a1e237de8..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/mbr.S +++ /dev/null @@ -1,15 +0,0 @@ -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - - .text - .arch i386 - .section ".prefix", "awx", @progbits - .code16 - .org 0 - -mbr: - movw $exec_sector, %bp - jmp find_active_partition -exec_sector: - ljmp $0x0000, $0x7c00 - -#include "bootpart.S" diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/mromprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/mromprefix.S deleted file mode 100644 index b636b92af..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/mromprefix.S +++ /dev/null @@ -1,516 +0,0 @@ -/* - * Copyright (C) 2010 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements. - * - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -#define PCIBIOS_READ_CONFIG_WORD 0xb109 -#define PCIBIOS_READ_CONFIG_DWORD 0xb10a -#define PCIBIOS_WRITE_CONFIG_WORD 0xb10c -#define PCIBIOS_WRITE_CONFIG_DWORD 0xb10d -#define PCI_COMMAND 0x04 -#define PCI_COMMAND_MEM 0x02 -#define PCI_BAR_0 0x10 -#define PCI_BAR_5 0x24 -#define PCI_BAR_EXPROM 0x30 - -#define PCIR_SIGNATURE ( 'P' + ( 'C' << 8 ) + ( 'I' << 16 ) + ( 'R' << 24 ) ) - -#define ROMPREFIX_EXCLUDE_PAYLOAD 1 -#define ROMPREFIX_MORE_IMAGES 1 -#define _pcirom_start _mrom_start -#include "pciromprefix.S" - - .text - .arch i386 - .code16 - -/* Obtain access to payload by exposing the expansion ROM BAR at the - * address currently used by a suitably large memory BAR on the same - * device. The memory BAR is temporarily disabled. Using a memory - * BAR on the same device means that we don't have to worry about the - * configuration of any intermediate PCI bridges. - * - * Parameters: - * %ds:0000 : Prefix - * %esi : Buffer for copy of image source (or zero if no buffer available) - * %ecx : Expected offset within buffer of first payload block - * Returns: - * %esi : Valid image source address (buffered or unbuffered) - * %ecx : Actual offset within buffer of first payload block - * CF set on error - */ - .section ".text16.early", "awx", @progbits - .globl open_payload -open_payload: - /* Preserve registers */ - pushl %eax - pushw %bx - pushl %edx - pushl %edi - pushw %bp - pushw %es - pushw %ds - - /* Retrieve bus:dev.fn from .prefix */ - movw init_pci_busdevfn, %bx - - /* Set up %ds for access to .text16.early */ - pushw %cs - popw %ds - - /* Set up %es for access to flat address space */ - xorw %ax, %ax - movw %ax, %es - - /* Store bus:dev.fn to .text16.early */ - movw %bx, payload_pci_busdevfn - - /* Get expansion ROM BAR current value */ - movw $PCI_BAR_EXPROM, %di - call pci_read_bar - movl %eax, rom_bar_orig_value - - /* Get expansion ROM BAR size */ - call pci_size_mem_bar_low - movl %ecx, rom_bar_size - - /* Find a suitable memory BAR to use */ - movw $PCI_BAR_0, %di /* %di is PCI BAR register */ - xorw %bp, %bp /* %bp is increment */ -find_mem_bar: - /* Move to next BAR */ - addw %bp, %di - cmpw $PCI_BAR_5, %di - jle 1f - stc - movl $0xbabababa, %esi /* Report "No suitable BAR" */ - movl rom_bar_size, %ecx - jmp 99f -1: movw $4, %bp - - /* Get BAR current value */ - call pci_read_bar - - /* Skip non-existent BARs */ - notl %eax - testl %eax, %eax - notl %eax - jz find_mem_bar - - /* Skip I/O BARs */ - testb $0x01, %al - jnz find_mem_bar - - /* Set increment to 8 for 64-bit BARs */ - testb $0x04, %al - jz 1f - movw $8, %bp -1: - /* Skip 64-bit BARs with high dword set; we couldn't use this - * address for the (32-bit) expansion ROM BAR anyway - */ - testl %edx, %edx - jnz find_mem_bar - - /* Get low dword of BAR size */ - call pci_size_mem_bar_low - - /* Skip BARs smaller than the expansion ROM BAR */ - cmpl %ecx, rom_bar_size - ja find_mem_bar - - /* We have a memory BAR with a 32-bit address that is large - * enough to use. Store BAR number and original value. - */ - movw %di, stolen_bar_register - movl %eax, stolen_bar_orig_value - - /* Remove flags from BAR address */ - xorb %al, %al - - /* Write zero to our stolen BAR. This doesn't technically - * disable it, but it's a pretty safe bet that the PCI bridge - * won't pass through accesses to this region anyway. Note - * that the high dword (if any) must already be zero. - */ - xorl %ecx, %ecx - call pci_write_config_dword - - /* Enable expansion ROM BAR at stolen BAR's address */ - movl %eax, %ecx - orb $0x1, %cl - movw $PCI_BAR_EXPROM, %di - call pci_write_config_dword - - /* Locate our ROM image */ -1: movl $0xaa55, %ecx /* 55aa signature */ - addr32 es cmpw %cx, (%eax) - jne 2f - movl $PCIR_SIGNATURE, %ecx /* PCIR signature */ - addr32 es movzwl 0x18(%eax), %edx - addr32 es cmpl %ecx, (%eax,%edx) - jne 2f - addr32 es cmpl $_build_id, build_id(%eax) /* iPXE build ID */ - je 3f - movl $0x80, %ecx /* Last image */ - addr32 es testb %cl, 0x15(%eax,%edx) - jnz 2f - addr32 es movzwl 0x10(%eax,%edx), %ecx /* PCIR image length */ - shll $9, %ecx - addl %ecx, %eax - jmp 1b -2: /* Failure */ - stc - movl %eax, %esi /* Report failure address */ - jmp 99f -3: - - /* Copy payload to buffer, or set buffer address to BAR address */ - testl %esi, %esi - jz 1f - /* We have a buffer; copy payload to it. Since .mrom is - * designed specifically for real hardware, we assume that - * flat real mode is working properly. (In the unlikely event - * that this code is run inside a hypervisor that doesn't - * properly support flat real mode, it will die horribly.) - */ - pushl %esi - movl %esi, %edi - movl %eax, %esi - addr32 es movzbl 2(%esi), %ecx - shll $7, %ecx - addr32 es movzwl mpciheader_image_length(%esi,%ecx,4), %edx - shll $7, %edx - addl %edx, %ecx - addr32 es rep movsl - popl %esi - jmp 2f -1: /* We have no buffer; set %esi to the BAR address */ - movl %eax, %esi -2: - - /* Locate first payload block (after the dummy ROM header) */ - addr32 es movzbl 2(%esi), %ecx - shll $9, %ecx - addl $_pprefix_skip, %ecx - - clc - /* Restore registers and return */ -99: popw %ds - popw %es - popw %bp - popl %edi - popl %edx - popw %bx - popl %eax - lret - .size open_payload, . - open_payload - - .section ".text16.early.data", "aw", @progbits -payload_pci_busdevfn: - .word 0 - .size payload_pci_busdevfn, . - payload_pci_busdevfn - - .section ".text16.early.data", "aw", @progbits -rom_bar_orig_value: - .long 0 - .size rom_bar_orig_value, . - rom_bar_orig_value - - .section ".text16.early.data", "aw", @progbits -rom_bar_size: - .long 0 - .size rom_bar_size, . - rom_bar_size - - .section ".text16.early.data", "aw", @progbits -stolen_bar_register: - .word 0 - .size stolen_bar_register, . - stolen_bar_register - - .section ".text16.early.data", "aw", @progbits -stolen_bar_orig_value: - .long 0 - .size stolen_bar_orig_value, . - stolen_bar_orig_value - -/* Restore original BAR values - * - * Parameters: - * none - * Returns: - * none - */ - .section ".text16.early", "awx", @progbits - .globl close_payload -close_payload: - /* Preserve registers */ - pushw %bx - pushw %di - pushl %ecx - pushw %ds - - /* Set up %ds for access to .text16.early */ - pushw %cs - popw %ds - - /* Retrieve stored bus:dev.fn */ - movw payload_pci_busdevfn, %bx - - /* Restore expansion ROM BAR original value */ - movw $PCI_BAR_EXPROM, %di - movl rom_bar_orig_value, %ecx - call pci_write_config_dword - - /* Restore stolen BAR original value */ - movw stolen_bar_register, %di - movl stolen_bar_orig_value, %ecx - call pci_write_config_dword - - /* Restore registers and return */ - popw %ds - popl %ecx - popw %di - popw %bx - lret - .size close_payload, . - close_payload - -/* Get PCI BAR value - * - * Parameters: - * %bx : PCI bus:dev.fn - * %di : PCI BAR register number - * Returns: - * %edx:%eax : PCI BAR value - */ - .section ".text16.early", "awx", @progbits -pci_read_bar: - /* Preserve registers */ - pushl %ecx - pushw %di - - /* Read low dword value */ - call pci_read_config_dword - movl %ecx, %eax - - /* Read high dword value, if applicable */ - xorl %edx, %edx - andb $0x07, %cl - cmpb $0x04, %cl - jne 1f - addw $4, %di - call pci_read_config_dword - movl %ecx, %edx -1: - /* Restore registers and return */ - popw %di - popl %ecx - ret - .size pci_read_bar, . - pci_read_bar - -/* Get low dword of PCI memory BAR size - * - * Parameters: - * %bx : PCI bus:dev.fn - * %di : PCI BAR register number - * %eax : Low dword of current PCI BAR value - * Returns: - * %ecx : PCI BAR size - */ - .section ".text16.early", "awx", @progbits -pci_size_mem_bar_low: - /* Preserve registers */ - pushw %dx - - /* Disable memory accesses */ - xorw %dx, %dx - call pci_set_mem_access - - /* Write all ones to BAR */ - xorl %ecx, %ecx - decl %ecx - call pci_write_config_dword - - /* Read back BAR */ - call pci_read_config_dword - - /* Calculate size */ - notl %ecx - orb $0x0f, %cl - incl %ecx - - /* Restore original value */ - pushl %ecx - movl %eax, %ecx - call pci_write_config_dword - popl %ecx - - /* Enable memory accesses */ - movw $PCI_COMMAND_MEM, %dx - call pci_set_mem_access - - /* Restore registers and return */ - popw %dx - ret - .size pci_size_mem_bar_low, . - pci_size_mem_bar_low - -/* Read PCI config dword - * - * Parameters: - * %bx : PCI bus:dev.fn - * %di : PCI register number - * Returns: - * %ecx : Dword value - */ - .section ".text16.early", "awx", @progbits -pci_read_config_dword: - /* Preserve registers */ - pushl %eax - pushl %ebx - pushl %edx - - /* Issue INT 0x1a,b10a */ - movw $PCIBIOS_READ_CONFIG_DWORD, %ax - int $0x1a - - /* Restore registers and return */ - popl %edx - popl %ebx - popl %eax - ret - .size pci_read_config_dword, . - pci_read_config_dword - -/* Write PCI config dword - * - * Parameters: - * %bx : PCI bus:dev.fn - * %di : PCI register number - * %ecx : PCI BAR value - * Returns: - * none - */ - .section ".text16.early", "awx", @progbits -pci_write_config_dword: - /* Preserve registers */ - pushal - - /* Issue INT 0x1a,b10d */ - movw $PCIBIOS_WRITE_CONFIG_DWORD, %ax - int $0x1a - - /* Restore registers and return */ - popal - ret - .size pci_write_config_dword, . - pci_write_config_dword - -/* Enable/disable memory access response in PCI command word - * - * Parameters: - * %bx : PCI bus:dev.fn - * %dx : PCI_COMMAND_MEM, or zero - * Returns: - * none - */ - .section ".text16.early", "awx", @progbits -pci_set_mem_access: - /* Preserve registers */ - pushal - - /* Read current value of command register */ - pushw %bx - pushw %dx - movw $PCI_COMMAND, %di - movw $PCIBIOS_READ_CONFIG_WORD, %ax - int $0x1a - popw %dx - popw %bx - - /* Set memory access enable as appropriate */ - andw $~PCI_COMMAND_MEM, %cx - orw %dx, %cx - - /* Write new value of command register */ - movw $PCIBIOS_WRITE_CONFIG_WORD, %ax - int $0x1a - - /* Restore registers and return */ - popal - ret - .size pci_set_mem_access, . - pci_set_mem_access - -/* Payload prefix - * - * We include a dummy ROM header to cover the "hidden" portion of the - * overall ROM image. - */ - .globl _payload_align - .equ _payload_align, 512 - .section ".pprefix", "ax", @progbits - .org 0x00 -mromheader: - .word 0xaa55 /* BIOS extension signature */ - .byte 0x01 /* Dummy size (BIOS bug workaround) */ - .org 0x18 - .word mpciheader - .org 0x1a - .word 0 - .size mromheader, . - mromheader - -mpciheader: - .ascii "PCIR" /* Signature */ - .word pci_vendor_id /* Vendor identification */ - .word pci_device_id /* Device identification */ - .word 0x0000 /* Device list pointer */ - .word mpciheader_len /* PCI data structure length */ - .byte 0x03 /* PCI data structure revision */ - .byte 0x02, 0x00, 0x00 /* Class code */ -mpciheader_image_length: - .word 0 /* Image length */ - .word 0x0001 /* Revision level */ - .byte 0xff /* Code type */ - .byte 0x80 /* Last image indicator */ -mpciheader_runtime_length: - .word 0 /* Maximum run-time image length */ - .word 0x0000 /* Configuration utility code header */ - .word 0x0000 /* DMTF CLP entry point */ - .equ mpciheader_len, . - mpciheader - .size mpciheader, . - mpciheader - - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "APPW" - .long mpciheader_image_length - .long 512 - .long 0 - .ascii "APPW" - .long mpciheader_runtime_length - .long 512 - .long 0 - .previous - -/* Fix up additional image source size - * - */ - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "ADPW" - .long extra_size - .long 512 - .long 0 - .previous diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/nbiprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/nbiprefix.S deleted file mode 100644 index 16c79566c..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/nbiprefix.S +++ /dev/null @@ -1,84 +0,0 @@ -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - - .text - .arch i386 - .code16 - .section ".prefix", "ax", @progbits - .org 0 - -nbi_header: - -/***************************************************************************** - * NBI file header - ***************************************************************************** - */ -file_header: - .long 0x1b031336 /* Signature */ - .byte 0x04 /* 16 bytes header, no vendor info */ - .byte 0 - .byte 0 - .byte 0 /* No flags */ - .word 0x0000, 0x07c0 /* Load header to 0x07c0:0x0000 */ - .word _nbi_start, 0x07c0 /* Start execution at 0x07c0:entry */ - .size file_header, . - file_header - -/***************************************************************************** - * NBI segment header - ***************************************************************************** - */ -segment_header: - .byte 0x04 /* 16 bytes header, no vendor info */ - .byte 0 - .byte 0 - .byte 0x04 /* Last segment */ - .long 0x00007e00 -imglen: .long -512 -memlen: .long -512 - .size segment_header, . - segment_header - - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "ADDL" - .long imglen - .long 1 - .long 0 - .ascii "ADDL" - .long memlen - .long 1 - .long 0 - .previous - -/***************************************************************************** - * NBI entry point - ***************************************************************************** - */ - .globl _nbi_start -_nbi_start: - /* Install iPXE */ - call install - - /* Set up real-mode stack */ - movw %bx, %ss - movw $_estack16, %sp - - /* Jump to .text16 segment */ - pushw %ax - pushw $1f - lret - .section ".text16", "awx", @progbits -1: - pushl $main - pushw %cs - call prot_call - popl %ecx /* discard */ - - /* Uninstall iPXE */ - call uninstall - - /* Reboot system */ - int $0x19 - - .previous - .size _nbi_start, . - _nbi_start - -nbi_header_end: - .org 512 diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/nullprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/nullprefix.S deleted file mode 100644 index bd0ff339e..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/nullprefix.S +++ /dev/null @@ -1,15 +0,0 @@ -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - - .org 0 - .text - .arch i386 - - .section ".prefix", "ax", @progbits - .code16 -_prefix: - - .section ".text16", "ax", @progbits -prefix_exit: - -prefix_exit_end: - .previous diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/pciromprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/pciromprefix.S deleted file mode 100644 index 5a5a49647..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/pciromprefix.S +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements. - * - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -#define BUSTYPE "PCIR" -#define _rom_start _pcirom_start -#include "romprefix.S" diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/pxeprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/pxeprefix.S deleted file mode 100644 index 465ce4345..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/pxeprefix.S +++ /dev/null @@ -1,862 +0,0 @@ -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -#define PXENV_UNDI_SHUTDOWN 0x0005 -#define PXENV_UNDI_GET_NIC_TYPE 0x0012 -#define PXENV_UNDI_GET_IFACE_INFO 0x0013 -#define PXENV_STOP_UNDI 0x0015 -#define PXENV_UNLOAD_STACK 0x0070 -#define PXENV_GET_CACHED_INFO 0x0071 -#define PXENV_PACKET_TYPE_DHCP_ACK 0x0002 -#define PXENV_FILE_CMDLINE 0x00e8 - -#define PXE_HACK_EB54 0x0001 - - .text - .arch i386 - .org 0 - .code16 - -#include <undi.h> - -#define STACK_MAGIC ( 'L' + ( 'R' << 8 ) + ( 'E' << 16 ) + ( 'T' << 24 ) ) -#define EB_MAGIC_1 ( 'E' + ( 't' << 8 ) + ( 'h' << 16 ) + ( 'e' << 24 ) ) -#define EB_MAGIC_2 ( 'r' + ( 'b' << 8 ) + ( 'o' << 16 ) + ( 'o' << 24 ) ) - -/* Prefix memory layout: - * - * iPXE binary image - * Temporary stack - * Temporary copy of DHCPACK packet - * Temporary copy of command line - */ -#define PREFIX_STACK_SIZE 2048 -#define PREFIX_TEMP_DHCPACK PREFIX_STACK_SIZE -#define PREFIX_TEMP_DHCPACK_SIZE ( 1260 /* sizeof ( BOOTPLAYER_t ) */ ) -#define PREFIX_TEMP_CMDLINE ( PREFIX_TEMP_DHCPACK + PREFIX_TEMP_DHCPACK_SIZE ) -#define PREFIX_TEMP_CMDLINE_SIZE 4096 - -/***************************************************************************** - * Entry point: set operating context, print welcome message - ***************************************************************************** - */ - .section ".prefix", "ax", @progbits - .globl _pxe_start -_pxe_start: - jmp $0x7c0, $1f -1: - /* Preserve registers for possible return to PXE */ - pushfl - pushal - pushw %gs - pushw %fs - pushw %es - pushw %ds - - /* Store magic word on PXE stack and remember PXE %ss:esp */ - pushl $STACK_MAGIC - movw %ss, %cs:pxe_ss - movl %esp, %cs:pxe_esp - - /* Set up segments */ - movw %cs, %ax - movw %ax, %ds - movw $0x40, %ax /* BIOS data segment access */ - movw %ax, %fs - /* Set up temporary stack immediately after the iPXE image */ - movw %cs, %ax - addw image_size_pgh, %ax - movw %ax, %ss - movl $PREFIX_STACK_SIZE, %esp - /* Clear direction flag, for the sake of sanity */ - cld - /* Print welcome message */ - movw $10f, %si - xorw %di, %di - call print_message - .section ".prefix.data", "aw", @progbits -10: .asciz "PXE->EB:" - .previous - - /* Image size (for stack placement calculation) */ - .section ".prefix.data", "aw", @progbits -image_size_pgh: - .word 0 - .previous - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "ADDW" - .long image_size_pgh - .long 16 - .long 0 - .previous - -/***************************************************************************** - * Find us a usable !PXE or PXENV+ entry point - ***************************************************************************** - */ -detect_pxe: - /* Plan A: !PXE pointer from the stack */ - lgsl pxe_esp, %ebp /* %gs:%bp -> original stack */ - lesw %gs:52(%bp), %bx - call is_valid_ppxe - je have_ppxe - - /* Plan B: PXENV+ pointer from initial ES:BX */ - movw %gs:32(%bp),%bx - movw %gs:8(%bp),%es - call is_valid_pxenv - je have_pxenv - - /* Plan C: PXENV+ structure via INT 1Ah */ - movw $0x5650, %ax - int $0x1a - jc 1f - cmpw $0x564e, %ax - jne 1f - call is_valid_pxenv - je have_pxenv -1: - /* Plan D: scan base memory for !PXE */ - call memory_scan_ppxe - je have_ppxe - - /* Plan E: scan base memory for PXENV+ */ - call memory_scan_pxenv - jne stack_not_found - -have_pxenv: - movw %bx, pxenv_offset - movw %es, pxenv_segment - - cmpw $0x201, %es:6(%bx) /* API version >= 2.01 */ - jb 1f - cmpb $0x2c, %es:8(%bx) /* ... and structure long enough */ - jb 2f - - lesw %es:0x28(%bx), %bx /* Find !PXE from PXENV+ */ - call is_valid_ppxe - je have_ppxe -2: - call memory_scan_ppxe /* We are *supposed* to have !PXE... */ - je have_ppxe -1: - lesw pxenv_segoff, %bx /* Nope, we're stuck with PXENV+ */ - - /* Record entry point and UNDI segments */ - pushl %es:0x0a(%bx) /* Entry point */ - pushw %es:0x24(%bx) /* UNDI code segment */ - pushw %es:0x26(%bx) /* UNDI code size */ - pushw %es:0x20(%bx) /* UNDI data segment */ - pushw %es:0x22(%bx) /* UNDI data size */ - - /* Print "PXENV+ at <address>" */ - movw $10f, %si - jmp check_have_stack - .section ".prefix.data", "aw", @progbits -10: .asciz " PXENV+ at " - .previous - -have_ppxe: - movw %bx, ppxe_offset - movw %es, ppxe_segment - - pushl %es:0x10(%bx) /* Entry point */ - pushw %es:0x30(%bx) /* UNDI code segment */ - pushw %es:0x36(%bx) /* UNDI code size */ - pushw %es:0x28(%bx) /* UNDI data segment */ - pushw %es:0x2e(%bx) /* UNDI data size */ - - /* Print "!PXE at <address>" */ - movw $10f, %si - jmp check_have_stack - .section ".prefix.data", "aw", @progbits -10: .asciz " !PXE at " - .previous - -is_valid_ppxe: - cmpl $0x45585021, %es:(%bx) - jne 1f - movzbw %es:4(%bx), %cx - cmpw $0x58, %cx - jae is_valid_checksum -1: - ret - -is_valid_pxenv: - cmpl $0x4e455850, %es:(%bx) - jne 1b - cmpw $0x2b56, %es:4(%bx) - jne 1b - movzbw %es:8(%bx), %cx - cmpw $0x28, %cx - jb 1b - -is_valid_checksum: - pushw %ax - movw %bx, %si - xorw %ax, %ax -2: - es lodsb - addb %al, %ah - loopw 2b - popw %ax - ret - -memory_scan_ppxe: - movw $is_valid_ppxe, %dx - jmp memory_scan_common - -memory_scan_pxenv: - movw $is_valid_pxenv, %dx - -memory_scan_common: - movw %fs:(0x13), %ax - shlw $6, %ax - decw %ax -1: incw %ax - cmpw $( 0xa000 - 1 ), %ax - ja 2f - movw %ax, %es - xorw %bx, %bx - call *%dx - jne 1b -2: ret - -/***************************************************************************** - * Sanity check: we must have an entry point - ***************************************************************************** - */ -check_have_stack: - /* Save common values pushed onto the stack */ - popl undi_data_segoff - popl undi_code_segoff - popl entry_segoff - - /* Print have !PXE/PXENV+ message; structure pointer in %es:%bx */ - call print_message - call print_segoff - movb $( ',' ), %al - call print_character - - /* Check for entry point */ - movl entry_segoff, %eax - testl %eax, %eax - jnz 99f - /* No entry point: print message and skip everything else */ -stack_not_found: - movw $10f, %si - call print_message - jmp finished - .section ".prefix.data", "aw", @progbits -10: .asciz " No PXE stack found!\n" - .previous -99: - -/***************************************************************************** - * Calculate base memory usage by UNDI - ***************************************************************************** - */ -find_undi_basemem_usage: - movw undi_code_segment, %ax - movw undi_code_size, %bx - movw undi_data_segment, %cx - movw undi_data_size, %dx - cmpw %ax, %cx - ja 1f - xchgw %ax, %cx - xchgw %bx, %dx -1: /* %ax:%bx now describes the lower region, %cx:%dx the higher */ - shrw $6, %ax /* Round down to nearest kB */ - movw %ax, undi_fbms_start - addw $0x0f, %dx /* Round up to next segment */ - shrw $4, %dx - addw %dx, %cx - addw $((1024 / 16) - 1), %cx /* Round up to next kB */ - shrw $6, %cx - movw %cx, undi_fbms_end - -/***************************************************************************** - * Print information about detected PXE stack - ***************************************************************************** - */ -print_structure_information: - /* Print entry point */ - movw $10f, %si - call print_message - les entry_segoff, %bx - call print_segoff - .section ".prefix.data", "aw", @progbits -10: .asciz " entry point at " - .previous - /* Print UNDI code segment */ - movw $10f, %si - call print_message - les undi_code_segoff, %bx - call print_segoff - .section ".prefix.data", "aw", @progbits -10: .asciz "\n UNDI code segment " - .previous - /* Print UNDI data segment */ - movw $10f, %si - call print_message - les undi_data_segoff, %bx - call print_segoff - .section ".prefix.data", "aw", @progbits -10: .asciz ", data segment " - .previous - /* Print UNDI memory usage */ - movw $10f, %si - call print_message - movw undi_fbms_start, %ax - call print_word - movb $( '-' ), %al - call print_character - movw undi_fbms_end, %ax - call print_word - movw $20f, %si - call print_message - .section ".prefix.data", "aw", @progbits -10: .asciz " (" -20: .asciz "kB)\n" - .previous - -/***************************************************************************** - * Determine physical device - ***************************************************************************** - */ -get_physical_device: - /* Issue PXENV_UNDI_GET_NIC_TYPE */ - movw $PXENV_UNDI_GET_NIC_TYPE, %bx - call pxe_call - jnc 1f - call print_pxe_error - jmp no_physical_device -1: /* Determine physical device type */ - movb ( pxe_parameter_structure + 0x02 ), %al - cmpb $2, %al - je pci_physical_device - jmp no_physical_device - -pci_physical_device: - /* Record PCI bus:dev.fn and vendor/device IDs */ - movl ( pxe_parameter_structure + 0x03 ), %eax - movl %eax, pci_vendor - movw ( pxe_parameter_structure + 0x0b ), %ax - movw %ax, pci_busdevfn - movw $10f, %si - call print_message - call print_pci_busdevfn - jmp 99f - .section ".prefix.data", "aw", @progbits -10: .asciz " UNDI device is PCI " - .previous - -no_physical_device: - /* No device found, or device type not understood */ - movw $10f, %si - call print_message - .section ".prefix.data", "aw", @progbits -10: .asciz " Unable to determine UNDI physical device" - .previous - -99: - -/***************************************************************************** - * Determine interface type - ***************************************************************************** - */ -get_iface_type: - /* Issue PXENV_UNDI_GET_IFACE_INFO */ - movw $PXENV_UNDI_GET_IFACE_INFO, %bx - call pxe_call - jnc 1f - call print_pxe_error - jmp 99f -1: /* Print interface type */ - movw $10f, %si - call print_message - leaw ( pxe_parameter_structure + 0x02 ), %si - call print_message - .section ".prefix.data", "aw", @progbits -10: .asciz ", type " - .previous - /* Check for "Etherboot" interface type */ - cmpl $EB_MAGIC_1, ( pxe_parameter_structure + 0x02 ) - jne 99f - cmpl $EB_MAGIC_2, ( pxe_parameter_structure + 0x06 ) - jne 99f - movw $10f, %si - call print_message - .section ".prefix.data", "aw", @progbits -10: .asciz " (workaround enabled)" - .previous - /* Flag Etherboot workarounds as required */ - orw $PXE_HACK_EB54, pxe_hacks - -99: movb $0x0a, %al - call print_character - -/***************************************************************************** - * Get cached DHCP_ACK packet - ***************************************************************************** - */ -get_dhcpack: - /* Issue PXENV_GET_CACHED_INFO */ - xorl %esi, %esi - movw %ss, %si - movw %si, ( pxe_parameter_structure + 0x08 ) - movw $PREFIX_TEMP_DHCPACK, ( pxe_parameter_structure + 0x06 ) - movw $PREFIX_TEMP_DHCPACK_SIZE, ( pxe_parameter_structure +0x04 ) - movw $PXENV_PACKET_TYPE_DHCP_ACK, ( pxe_parameter_structure + 0x02 ) - movw $PXENV_GET_CACHED_INFO, %bx - call pxe_call - jnc 1f - call print_pxe_error - jmp 99f -1: /* Store physical address of packet */ - shll $4, %esi - addl $PREFIX_TEMP_DHCPACK, %esi - movl %esi, pxe_cached_dhcpack -99: - .section ".prefix.data", "aw", @progbits -pxe_cached_dhcpack: - .long 0 - .previous - -/***************************************************************************** - * Check for a command line - ***************************************************************************** - */ -get_cmdline: - /* Issue PXENV_FILE_CMDLINE */ - xorl %esi, %esi - movw %ss, %si - movw %si, ( pxe_parameter_structure + 0x06 ) - movw $PREFIX_TEMP_CMDLINE, ( pxe_parameter_structure + 0x04 ) - movw $PREFIX_TEMP_CMDLINE_SIZE, ( pxe_parameter_structure + 0x02 ) - movw $PXENV_FILE_CMDLINE, %bx - call pxe_call - jc 99f /* Suppress errors; this is an iPXE extension API call */ - /* Check for non-NULL command line */ - movw ( pxe_parameter_structure + 0x02 ), %ax - testw %ax, %ax - jz 99f - /* Record command line */ - shll $4, %esi - addl $PREFIX_TEMP_CMDLINE, %esi - movl %esi, pxe_cmdline -99: - .section ".prefix.data", "aw", @progbits -pxe_cmdline: - .long 0 - .previous - -/***************************************************************************** - * Leave NIC in a safe state - ***************************************************************************** - */ -#ifndef PXELOADER_KEEP_PXE -shutdown_nic: - /* Issue PXENV_UNDI_SHUTDOWN */ - movw $PXENV_UNDI_SHUTDOWN, %bx - call pxe_call - jnc 1f - call print_pxe_error -1: -unload_base_code: - /* Etherboot treats PXENV_UNLOAD_STACK as PXENV_STOP_UNDI, so - * we must not issue this call if the underlying stack is - * Etherboot and we were not intending to issue a PXENV_STOP_UNDI. - */ -#ifdef PXELOADER_KEEP_UNDI - testw $PXE_HACK_EB54, pxe_hacks - jnz 99f -#endif /* PXELOADER_KEEP_UNDI */ - /* Issue PXENV_UNLOAD_STACK */ - movw $PXENV_UNLOAD_STACK, %bx - call pxe_call - jnc 1f - call print_pxe_error - jmp 99f -1: /* Free base memory used by PXE base code */ - movw undi_fbms_start, %ax - movw %fs:(0x13), %bx - call free_basemem -99: - andw $~( UNDI_FL_INITIALIZED | UNDI_FL_KEEP_ALL ), flags -#endif /* PXELOADER_KEEP_PXE */ - -/***************************************************************************** - * Unload UNDI driver - ***************************************************************************** - */ -#ifndef PXELOADER_KEEP_UNDI -unload_undi: - /* Issue PXENV_STOP_UNDI */ - movw $PXENV_STOP_UNDI, %bx - call pxe_call - jnc 1f - call print_pxe_error - jmp 99f -1: /* Free base memory used by UNDI */ - movw undi_fbms_end, %ax - movw undi_fbms_start, %bx - call free_basemem - /* Clear UNDI_FL_STARTED */ - andw $~UNDI_FL_STARTED, flags -99: -#endif /* PXELOADER_KEEP_UNDI */ - -/***************************************************************************** - * Print remaining free base memory - ***************************************************************************** - */ -print_free_basemem: - movw $10f, %si - call print_message - movw %fs:(0x13), %ax - call print_word - movw $20f, %si - call print_message - .section ".prefix.data", "aw", @progbits -10: .asciz " " -20: .asciz "kB free base memory after PXE unload\n" - .previous - -/***************************************************************************** - * Exit point - ***************************************************************************** - */ -finished: - jmp run_ipxe - -/***************************************************************************** - * Subroutine: print segment:offset address - * - * Parameters: - * %es:%bx : segment:offset address to print - * %ds:di : output buffer (or %di=0 to print to console) - * Returns: - * %ds:di : next character in output buffer (if applicable) - ***************************************************************************** - */ -print_segoff: - /* Preserve registers */ - pushw %ax - /* Print "<segment>:offset" */ - movw %es, %ax - call print_hex_word - movb $( ':' ), %al - call print_character - movw %bx, %ax - call print_hex_word - /* Restore registers and return */ - popw %ax - ret - -/***************************************************************************** - * Subroutine: print decimal word - * - * Parameters: - * %ax : word to print - * %ds:di : output buffer (or %di=0 to print to console) - * Returns: - * %ds:di : next character in output buffer (if applicable) - ***************************************************************************** - */ -print_word: - /* Preserve registers */ - pushw %ax - pushw %bx - pushw %cx - pushw %dx - /* Build up digit sequence on stack */ - movw $10, %bx - xorw %cx, %cx -1: xorw %dx, %dx - divw %bx, %ax - pushw %dx - incw %cx - testw %ax, %ax - jnz 1b - /* Print digit sequence */ -1: popw %ax - call print_hex_nibble - loop 1b - /* Restore registers and return */ - popw %dx - popw %cx - popw %bx - popw %ax - ret - -/***************************************************************************** - * Subroutine: zero 1kB block of base memory - * - * Parameters: - * %bx : block to zero (in kB) - * Returns: - * Nothing - ***************************************************************************** - */ -zero_kb: - /* Preserve registers */ - pushw %ax - pushw %cx - pushw %di - pushw %es - /* Zero block */ - movw %bx, %ax - shlw $6, %ax - movw %ax, %es - movw $0x400, %cx - xorw %di, %di - xorw %ax, %ax - rep stosb - /* Restore registers and return */ - popw %es - popw %di - popw %cx - popw %ax - ret - -/***************************************************************************** - * Subroutine: free and zero base memory - * - * Parameters: - * %ax : Desired new free base memory counter (in kB) - * %bx : Expected current free base memory counter (in kB) - * %fs : BIOS data segment (0x40) - * Returns: - * None - * - * The base memory from %bx kB to %ax kB is unconditionally zeroed. - * It will be freed if and only if the expected current free base - * memory counter (%bx) matches the actual current free base memory - * counter in 0x40:0x13; if this does not match then the memory will - * be leaked. - ***************************************************************************** - */ -free_basemem: - /* Zero base memory */ - pushw %bx -1: cmpw %bx, %ax - je 2f - call zero_kb - incw %bx - jmp 1b -2: popw %bx - /* Free base memory */ - cmpw %fs:(0x13), %bx /* Update FBMS only if "old" value */ - jne 1f /* is correct */ -1: movw %ax, %fs:(0x13) - ret - -/***************************************************************************** - * Subroutine: make a PXE API call. Works with either !PXE or PXENV+ API. - * - * Parameters: - * %bx : PXE API call number - * %ds:pxe_parameter_structure : Parameters for PXE API call - * Returns: - * %ax : PXE status code (not exit code) - * CF set if %ax is non-zero - ***************************************************************************** - */ -pxe_call: - /* Preserve registers */ - pushw %di - pushw %es - /* Set up registers for PXENV+ API. %bx already set up */ - pushw %ds - popw %es - movw $pxe_parameter_structure, %di - /* Set up stack for !PXE API */ - pushw %es - pushw %di - pushw %bx - /* Make the API call */ - lcall *entry_segoff - /* Reset the stack */ - addw $6, %sp - movw pxe_parameter_structure, %ax - clc - testw %ax, %ax - jz 1f - stc -1: /* Clear direction flag, for the sake of sanity */ - cld - /* Restore registers and return */ - popw %es - popw %di - ret - -/***************************************************************************** - * Subroutine: print PXE API call error message - * - * Parameters: - * %ax : PXE status code - * %bx : PXE API call number - * Returns: - * Nothing - ***************************************************************************** - */ -print_pxe_error: - pushw %si - movw $10f, %si - call print_message - xchgw %ax, %bx - call print_hex_word - movw $20f, %si - call print_message - xchgw %ax, %bx - call print_hex_word - movw $30f, %si - call print_message - popw %si - ret - .section ".prefix.data", "aw", @progbits -10: .asciz " UNDI API call " -20: .asciz " failed: status code " -30: .asciz "\n" - .previous - -/***************************************************************************** - * PXE data structures - ***************************************************************************** - */ - .section ".prefix.data" - -pxe_esp: .long 0 -pxe_ss: .word 0 - -pxe_parameter_structure: .fill 64 - -undi_code_segoff: -undi_code_size: .word 0 -undi_code_segment: .word 0 - -undi_data_segoff: -undi_data_size: .word 0 -undi_data_segment: .word 0 - -pxe_hacks: .word 0 - -/* The following fields are part of a struct undi_device */ - -undi_device: - -pxenv_segoff: -pxenv_offset: .word 0 -pxenv_segment: .word 0 - -ppxe_segoff: -ppxe_offset: .word 0 -ppxe_segment: .word 0 - -entry_segoff: -entry_offset: .word 0 -entry_segment: .word 0 - -undi_fbms_start: .word 0 -undi_fbms_end: .word 0 - -pci_busdevfn: .word UNDI_NO_PCI_BUSDEVFN -isapnp_csn: .word UNDI_NO_ISAPNP_CSN -isapnp_read_port: .word UNDI_NO_ISAPNP_READ_PORT - -pci_vendor: .word 0 -pci_device: .word 0 -flags: - .word ( UNDI_FL_INITIALIZED | UNDI_FL_STARTED | UNDI_FL_KEEP_ALL ) - - .equ undi_device_size, ( . - undi_device ) - -/***************************************************************************** - * Run iPXE main code - ***************************************************************************** - */ - .section ".prefix" -run_ipxe: - /* Install iPXE */ - call install - - /* Set up real-mode stack */ - movw %bx, %ss - movw $_estack16, %sp - -#ifdef PXELOADER_KEEP_UNDI - /* Copy our undi_device structure to the preloaded_undi variable */ - movw %bx, %es - movw $preloaded_undi, %di - movw $undi_device, %si - movw $undi_device_size, %cx - rep movsb -#endif - - /* Retrieve PXE %ss:esp */ - movw pxe_ss, %di - movl pxe_esp, %ebp - - /* Retrieve PXE command line, if any */ - movl pxe_cmdline, %esi - - /* Retrieve cached DHCPACK, if any */ - movl pxe_cached_dhcpack, %ecx - - /* Jump to .text16 segment with %ds pointing to .data16 */ - movw %bx, %ds - pushw %ax - pushw $1f - lret - .section ".text16", "ax", @progbits -1: - /* Update the exit hook */ - movw %cs, ( pxe_exit_hook + 2 ) - - /* Store command-line pointer */ - movl %esi, cmdline_phys - - /* Store cached DHCPACK pointer */ - movl %ecx, cached_dhcpack_phys - - /* Run main program */ - pushl $main - pushw %cs - call prot_call - popl %ecx /* discard */ - - /* Uninstall iPXE */ - call uninstall - - /* Restore PXE stack */ - movw %di, %ss - movl %ebp, %esp - - /* Jump to hook if applicable */ - ljmpw *pxe_exit_hook - - .section ".data16", "aw", @progbits - .globl pxe_exit_hook -pxe_exit_hook: - .word exit_ipxe, 0 - .previous - -exit_ipxe: - /* Check PXE stack magic */ - popl %eax - cmpl $STACK_MAGIC, %eax - jne 1f - - /* PXE stack OK: return to caller */ - popw %ds - popw %es - popw %fs - popw %gs - popal - popfl - xorw %ax, %ax /* Return success */ - lret - -1: /* PXE stack corrupt or removed: use INT 18 */ - int $0x18 - .previous diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/romprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/romprefix.S deleted file mode 100644 index 18dda2b37..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/romprefix.S +++ /dev/null @@ -1,895 +0,0 @@ -/* At entry, the processor is in 16 bit real mode and the code is being - * executed from an address it was not linked to. Code must be pic and - * 32 bit sensitive until things are fixed up. - * - * Also be very careful as the stack is at the rear end of the interrupt - * table so using a noticeable amount of stack space is a no-no. - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -#include <config/general.h> -#include <config/branding.h> - -#define PNP_SIGNATURE ( '$' + ( 'P' << 8 ) + ( 'n' << 16 ) + ( 'P' << 24 ) ) -#define PMM_SIGNATURE ( '$' + ( 'P' << 8 ) + ( 'M' << 16 ) + ( 'M' << 24 ) ) -#define PCI_SIGNATURE ( 'P' + ( 'C' << 8 ) + ( 'I' << 16 ) + ( ' ' << 24 ) ) -#define STACK_MAGIC ( 'L' + ( 'R' << 8 ) + ( 'E' << 16 ) + ( 'T' << 24 ) ) -#define PMM_ALLOCATE 0x0000 -#define PMM_FIND 0x0001 -#define PMM_HANDLE_BASE ( ( ( 'F' - 'A' + 1 ) << 26 ) + \ - ( ( 'E' - 'A' + 1 ) << 21 ) + \ - ( ( 'N' - 'A' + 1 ) << 16 ) ) -#define PMM_HANDLE_BASE_IMAGE_SOURCE \ - ( PMM_HANDLE_BASE | 0x00001000 ) -#define PMM_HANDLE_BASE_DECOMPRESS_TO \ - ( PMM_HANDLE_BASE | 0x00002000 ) -#define PCI_FUNC_MASK 0x07 - -/* ROM banner timeout, converted to a number of (18Hz) timer ticks. */ -#define ROM_BANNER_TIMEOUT_TICKS ( ( 18 * ROM_BANNER_TIMEOUT ) / 10 ) - -/* Allow payload to be excluded from ROM size - */ -#if ROMPREFIX_EXCLUDE_PAYLOAD -#define ZINFO_TYPE_ADxB "ADHB" -#define ZINFO_TYPE_ADxW "ADHW" -#else -#define ZINFO_TYPE_ADxB "ADDB" -#define ZINFO_TYPE_ADxW "ADDW" -#endif - -/* Allow ROM to be marked as containing multiple images - */ -#if ROMPREFIX_MORE_IMAGES -#define INDICATOR 0x00 -#else -#define INDICATOR 0x80 -#endif - -/* Default to building a PCI ROM if no bus type is specified - */ -#ifndef BUSTYPE -#define BUSTYPE "PCIR" -#endif - - .text - .code16 - .arch i386 - .section ".prefix", "ax", @progbits - .globl _rom_start -_rom_start: - - .org 0x00 -romheader: - .word 0xAA55 /* BIOS extension signature */ -romheader_size: .byte 0 /* Size in 512-byte blocks */ - jmp init /* Initialisation vector */ -checksum: - .byte 0 - .org 0x10 - .word ipxeheader - .org 0x16 - .word undiheader -.ifeqs BUSTYPE, "PCIR" - .org 0x18 - .word pciheader -.endif - .org 0x1a - .word pnpheader - .size romheader, . - romheader - - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii ZINFO_TYPE_ADxB - .long romheader_size - .long 512 - .long 0 - .previous - -.ifeqs BUSTYPE, "PCIR" -pciheader: - .ascii "PCIR" /* Signature */ - .word pci_vendor_id /* Vendor identification */ - .word pci_device_id /* Device identification */ - .word ( pci_devlist - pciheader ) /* Device list pointer */ - .word pciheader_len /* PCI data structure length */ - .byte 0x03 /* PCI data structure revision */ - .byte 0x02, 0x00, 0x00 /* Class code */ -pciheader_image_length: - .word 0 /* Image length */ - .word 0x0001 /* Revision level */ - .byte 0x00 /* Code type */ - .byte INDICATOR /* Last image indicator */ -pciheader_runtime_length: - .word 0 /* Maximum run-time image length */ - .word 0x0000 /* Configuration utility code header */ - .word 0x0000 /* DMTF CLP entry point */ - .equ pciheader_len, . - pciheader - .size pciheader, . - pciheader - - /* PCI additional device list (filled in by linker) */ - .section ".pci_devlist.00000000", "a", @progbits -pci_devlist: - .previous - .section ".pci_devlist.ffffffff", "a", @progbits -pci_devlist_end: - .short 0x0000 /* List terminator */ - .previous - /* Ensure that terminator is always present */ - .reloc pciheader, RELOC_TYPE_NONE, pci_devlist_end - - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii ZINFO_TYPE_ADxW - .long pciheader_image_length - .long 512 - .long 0 - .ascii ZINFO_TYPE_ADxW - .long pciheader_runtime_length - .long 512 - .long 0 - .previous -.endif /* PCIR */ - - /* PnP doesn't require any particular alignment, but IBM - * BIOSes will scan on 16-byte boundaries rather than using - * the offset stored at 0x1a - */ - .align 16 -pnpheader: - .ascii "$PnP" /* Signature */ - .byte 0x01 /* Structure revision */ - .byte ( pnpheader_len / 16 ) /* Length (in 16 byte increments) */ - .word 0x0000 /* Offset of next header */ - .byte 0x00 /* Reserved */ - .byte 0x00 /* Checksum */ - .long 0x00000000 /* Device identifier */ - .word mfgstr /* Manufacturer string */ - .word prodstr /* Product name */ - .byte 0x02 /* Device base type code */ - .byte 0x00 /* Device sub-type code */ - .byte 0x00 /* Device interface type code */ - .byte 0xf4 /* Device indicator */ - .word 0x0000 /* Boot connection vector */ - .word 0x0000 /* Disconnect vector */ - .word bev_entry /* Boot execution vector */ - .word 0x0000 /* Reserved */ - .word 0x0000 /* Static resource information vector*/ - .equ pnpheader_len, . - pnpheader - .size pnpheader, . - pnpheader - -/* Manufacturer string */ -mfgstr: - .asciz "http://ipxe.org" - .size mfgstr, . - mfgstr - -/* Product string - * - * Defaults to PRODUCT_SHORT_NAME. If the ROM image is writable at - * initialisation time, it will be filled in to include the PCI - * bus:dev.fn number of the card as well. - */ -prodstr: - .ascii PRODUCT_SHORT_NAME -.ifeqs BUSTYPE, "PCIR" -prodstr_separator: - .byte 0 - .ascii "(PCI " -prodstr_pci_id: - .ascii "xx:xx.x)" /* Filled in by init code */ -.endif /* PCIR */ - .byte 0 - .size prodstr, . - prodstr - - .globl undiheader - .weak undiloader -undiheader: - .ascii "UNDI" /* Signature */ - .byte undiheader_len /* Length of structure */ - .byte 0 /* Checksum */ - .byte 0 /* Structure revision */ - .byte 0,1,2 /* PXE version: 2.1.0 */ - .word undiloader /* Offset to loader routine */ - .word _data16_memsz /* Stack segment size */ - .word _data16_memsz /* Data segment size */ - .word _text16_memsz /* Code segment size */ - .ascii BUSTYPE /* Bus type */ - .equ undiheader_len, . - undiheader - .size undiheader, . - undiheader - -ipxeheader: - .ascii "iPXE" /* Signature */ - .byte ipxeheader_len /* Length of structure */ - .byte 0 /* Checksum */ -shrunk_rom_size: - .byte 0 /* Shrunk size (in 512-byte blocks) */ - .byte 0 /* Reserved */ -build_id: - .long _build_id /* Randomly-generated build ID */ - .equ ipxeheader_len, . - ipxeheader - .size ipxeheader, . - ipxeheader - - .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ - .ascii "ADHB" - .long shrunk_rom_size - .long 512 - .long 0 - .previous - -/* Initialisation (called once during POST) - * - * Determine whether or not this is a PnP system via a signature - * check. If it is PnP, return to the PnP BIOS indicating that we are - * a boot-capable device; the BIOS will call our boot execution vector - * if it wants to boot us. If it is not PnP, hook INT 19. - */ -init: - /* Preserve registers, clear direction flag, set %ds=%cs */ - pushaw - pushw %ds - pushw %es - pushw %fs - pushw %gs - cld - pushw %cs - popw %ds - - /* Print message as early as possible */ - movw $init_message, %si - xorw %di, %di - call print_message - - /* Store PCI 3.0 runtime segment address for later use, if - * applicable. - */ -.ifeqs BUSTYPE, "PCIR" - movw %bx, %gs -.endif - - /* Store PCI bus:dev.fn address, print PCI bus:dev.fn, and add - * PCI bus:dev.fn to product name string, if applicable. - */ -.ifeqs BUSTYPE, "PCIR" - xorw %di, %di - call print_space - movw %ax, init_pci_busdevfn - call print_pci_busdevfn - movw $prodstr_pci_id, %di - call print_pci_busdevfn - movb $( ' ' ), prodstr_separator -.endif - - /* Print segment address */ - xorw %di, %di - call print_space - movw %cs, %ax - call print_hex_word - - /* Check for PCI BIOS version, if applicable */ -.ifeqs BUSTYPE, "PCIR" - pushl %ebx - pushl %edx - pushl %edi - stc - movw $0xb101, %ax - int $0x1a - jc no_pci3 - cmpl $PCI_SIGNATURE, %edx - jne no_pci3 - testb %ah, %ah - jnz no_pci3 - movw $init_message_pci, %si - xorw %di, %di - call print_message - movb %bh, %al - call print_hex_nibble - movb $( '.' ), %al - call print_character - movb %bl, %al - call print_hex_byte - cmpb $3, %bh - jb no_pci3 - /* PCI >=3.0: leave %gs as-is if sane */ - movw %gs, %ax - cmpw $0xa000, %ax /* Insane if %gs < 0xa000 */ - jb pci3_insane - movw %cs, %bx /* Sane if %cs == %gs */ - cmpw %bx, %ax - je 1f - movzbw romheader_size, %cx /* Sane if %cs+len <= %gs */ - shlw $5, %cx - addw %cx, %bx - cmpw %bx, %ax - jae 1f - movw %cs, %bx /* Sane if %gs+len <= %cs */ - addw %cx, %ax - cmpw %bx, %ax - jbe 1f -pci3_insane: /* PCI 3.0 with insane %gs value: print error and ignore %gs */ - movb $( '!' ), %al - call print_character - movw %gs, %ax - call print_hex_word -no_pci3: - /* PCI <3.0: set %gs (runtime segment) = %cs (init-time segment) */ - pushw %cs - popw %gs -1: popl %edi - popl %edx - popl %ebx -.endif /* PCIR */ - - /* Check for PnP BIOS. Although %es:di should point to the - * PnP BIOS signature on entry, some BIOSes fail to do this. - */ - movw $( 0xf000 - 1 ), %bx -pnp_scan: - incw %bx - jz no_pnp - movw %bx, %es - cmpl $PNP_SIGNATURE, %es:0 - jne pnp_scan - xorw %dx, %dx - xorw %si, %si - movzbw %es:5, %cx -1: es lodsb - addb %al, %dl - loop 1b - jnz pnp_scan - /* Is PnP: print PnP message */ - movw $init_message_pnp, %si - xorw %di, %di - call print_message - jmp pnp_done -no_pnp: /* Not PnP-compliant - hook INT 19 */ -#ifdef NONPNP_HOOK_INT19 - movw $init_message_int19, %si - xorw %di, %di - call print_message - xorw %ax, %ax - movw %ax, %es - pushl %es:( 0x19 * 4 ) - popl orig_int19 - pushw %gs /* %gs contains runtime %cs */ - pushw $int19_entry - popl %es:( 0x19 * 4 ) -#endif /* NONPNP_HOOK_INT19 */ -pnp_done: - - /* Check for PMM */ - movw $( 0xe000 - 1 ), %bx -pmm_scan: - incw %bx - jz no_pmm - movw %bx, %es - cmpl $PMM_SIGNATURE, %es:0 - jne pmm_scan - xorw %dx, %dx - xorw %si, %si - movzbw %es:5, %cx -1: es lodsb - addb %al, %dl - loop 1b - jnz pmm_scan - /* PMM found: print PMM message */ - movw $init_message_pmm, %si - xorw %di, %di - call print_message - /* We have PMM and so a 1kB stack: preserve whole registers */ - pushal - /* Allocate image source PMM block. Round up the size to the - * nearest 4kB (8 512-byte sectors) to work around AMI BIOS bugs. - */ - movzbl romheader_size, %ecx - addw extra_size, %cx - addw $0x0007, %cx /* Round up to multiple of 8 512-byte sectors */ - andw $0xfff8, %cx - shll $5, %ecx - movl $PMM_HANDLE_BASE_IMAGE_SOURCE, %ebx - movw $get_pmm_image_source, %bp - call get_pmm - movl %esi, image_source - jz 1f - /* Copy ROM to image source PMM block */ - pushw %es - xorw %ax, %ax - movw %ax, %es - movl %esi, %edi - xorl %esi, %esi - movzbl romheader_size, %ecx - shll $7, %ecx - addr32 rep movsl /* PMM presence implies flat real mode */ - popw %es - /* Shrink ROM */ - movb shrunk_rom_size, %al - movb %al, romheader_size -1: /* Allocate decompression PMM block. Round up the size to the - * nearest 128kB and use the size within the PMM handle; this - * allows the same decompression area to be shared between - * multiple iPXE ROMs even with differing build IDs - */ - movl $_textdata_memsz_pgh, %ecx - addl $0x00001fff, %ecx - andl $0xffffe000, %ecx - movl %ecx, %ebx - shrw $12, %bx - orl $PMM_HANDLE_BASE_DECOMPRESS_TO, %ebx - movw $get_pmm_decompress_to, %bp - call get_pmm - movl %esi, decompress_to - /* Restore registers */ - popal -no_pmm: - - /* Update checksum */ - xorw %bx, %bx - xorw %si, %si - movzbw romheader_size, %cx - shlw $9, %cx -1: lodsb - addb %al, %bl - loop 1b - subb %bl, checksum - - /* Copy self to option ROM space, if applicable. Required for - * PCI3.0, which loads us to a temporary location in low - * memory. Will be a no-op for lower PCI versions. - */ -.ifeqs BUSTYPE, "PCIR" - xorw %di, %di - call print_space - movw %gs, %ax - call print_hex_word - movzbw romheader_size, %cx - shlw $9, %cx - movw %ax, %es - xorw %si, %si - xorw %di, %di - cs rep movsb -.endif - - /* Skip prompt if this is not the first PCI function, if applicable */ -.ifeqs BUSTYPE, "PCIR" - testb $PCI_FUNC_MASK, init_pci_busdevfn - jnz no_shell -.endif - /* Prompt for POST-time shell */ - movw $init_message_prompt, %si - xorw %di, %di - call print_message - movw $prodstr, %si - call print_message - movw $init_message_dots, %si - call print_message - /* Wait for Ctrl-B */ - movw $0xff02, %bx - call wait_for_key - /* Clear prompt */ - pushf - xorw %di, %di - call print_kill_line - movw $init_message_done, %si - call print_message - popf - jnz no_shell - /* Ctrl-B was pressed: invoke iPXE. The keypress will be - * picked up by the initial shell prompt, and we will drop - * into a shell. - */ - xorl %ebp, %ebp /* Inhibit use of INT 15,e820 and INT 15,e801 */ - pushw %cs - call exec -no_shell: - movb $( '\n' ), %al - xorw %di, %di - call print_character - - /* Restore registers */ - popw %gs - popw %fs - popw %es - popw %ds - popaw - - /* Indicate boot capability to PnP BIOS, if present */ - movw $0x20, %ax - lret - .size init, . - init - -/* Attempt to find or allocate PMM block - * - * Parameters: - * %ecx : size of block to allocate, in paragraphs - * %ebx : PMM handle base - * %bp : routine to check acceptability of found blocks - * %es:0000 : PMM structure - * Returns: - * %ebx : PMM handle - * %esi : allocated block address, or zero (with ZF set) if allocation failed - */ -get_pmm: - /* Preserve registers */ - pushl %eax - pushw %di - movw $( ' ' ), %di -get_pmm_find: - /* Try to find existing block */ - pushl %ebx /* PMM handle */ - pushw $PMM_FIND - lcall *%es:7 - addw $6, %sp - pushw %dx - pushw %ax - popl %esi - /* Treat 0xffffffff (not supported) as 0x00000000 (not found) */ - incl %esi - jz get_pmm_allocate - decl %esi - jz get_pmm_allocate - /* Block found - check acceptability */ - call *%bp - jnc get_pmm_done - /* Block not acceptable - increment handle and retry */ - incl %ebx - jmp get_pmm_find -get_pmm_allocate: - /* Block not found - try to allocate new block */ - pushw $0x0002 /* Extended memory */ - pushl %ebx /* PMM handle */ - pushl %ecx /* Length */ - pushw $PMM_ALLOCATE - lcall *%es:7 - addw $12, %sp - pushw %dx - pushw %ax - popl %esi - movw $( '+' ), %di /* Indicate allocation attempt */ -get_pmm_done: - /* Print block address */ - movw %di, %ax - xorw %di, %di - call print_character - movl %esi, %eax - call print_hex_dword - /* Treat 0xffffffff (not supported) as 0x00000000 (allocation - * failed), and set ZF to indicate a zero result. - */ - incl %esi - jz 1f - decl %esi -1: /* Restore registers and return */ - popw %di - popl %eax - ret - .size get_pmm, . - get_pmm - - /* Check acceptability of image source block */ -get_pmm_image_source: - pushw %es - xorw %ax, %ax - movw %ax, %es - movl build_id, %eax - addr32 cmpl %es:build_id(%esi), %eax - je 1f - stc -1: popw %es - ret - .size get_pmm_image_source, . - get_pmm_image_source - - /* Check acceptability of decompression block */ -get_pmm_decompress_to: - clc - ret - .size get_pmm_decompress_to, . - get_pmm_decompress_to - -/* - * Note to hardware vendors: - * - * If you wish to brand this boot ROM, please do so by defining the - * strings PRODUCT_NAME and PRODUCT_SHORT_NAME in config/branding.h. - * - * While nothing in the GPL prevents you from removing all references - * to iPXE or http://ipxe.org, we prefer you not to do so. - * - * If you have an OEM-mandated branding requirement that cannot be - * satisfied simply by defining PRODUCT_NAME and PRODUCT_SHORT_NAME, - * please contact us. - * - * [ Including an ASCII NUL in PRODUCT_NAME is considered to be - * bypassing the spirit of this request! ] - */ -init_message: - .ascii "\n" - .ascii PRODUCT_NAME - .ascii "\n" - .ascii PRODUCT_SHORT_NAME - .ascii " (" - .ascii PRODUCT_URI - .asciz ")" - .size init_message, . - init_message -.ifeqs BUSTYPE, "PCIR" -init_message_pci: - .asciz " PCI" - .size init_message_pci, . - init_message_pci -.endif /* PCIR */ -init_message_pnp: - .asciz " PnP" - .size init_message_pnp, . - init_message_pnp -init_message_pmm: - .asciz " PMM" - .size init_message_pmm, . - init_message_pmm -init_message_int19: - .asciz " INT19" - .size init_message_int19, . - init_message_int19 -init_message_prompt: - .asciz "\nPress Ctrl-B to configure " - .size init_message_prompt, . - init_message_prompt -init_message_dots: - .asciz "..." - .size init_message_dots, . - init_message_dots -init_message_done: - .asciz "\n\n" - .size init_message_done, . - init_message_done - -/* PCI bus:dev.fn - * - */ -.ifeqs BUSTYPE, "PCIR" -init_pci_busdevfn: - .word 0 - .size init_pci_busdevfn, . - init_pci_busdevfn -.endif /* PCIR */ - -/* Image source area - * - * May be either zero (indicating to use option ROM space as source), - * or within a PMM-allocated block. - */ - .globl image_source -image_source: - .long 0 - .size image_source, . - image_source - -/* Additional image source size (in 512-byte sectors) - * - */ -extra_size: - .word 0 - .size extra_size, . - extra_size - -/* Temporary decompression area - * - * May be either zero (indicating to use default decompression area in - * high memory), or within a PMM-allocated block. - */ - .globl decompress_to -decompress_to: - .long 0 - .size decompress_to, . - decompress_to - -/* Boot Execution Vector entry point - * - * Called by the PnP BIOS when it wants to boot us. - */ -bev_entry: - orl $0xffffffff, %ebp /* Allow arbitrary relocation */ - pushw %cs - call exec - lret - .size bev_entry, . - bev_entry - -/* INT19 entry point - * - * Called via the hooked INT 19 if we detected a non-PnP BIOS. We - * attempt to return via the original INT 19 vector (if we were able - * to store it). - */ -int19_entry: - pushw %cs - popw %ds - /* Prompt user to press B to boot */ - movw $int19_message_prompt, %si - xorw %di, %di - call print_message - movw $prodstr, %si - call print_message - movw $int19_message_dots, %si - call print_message - movw $0xdf4e, %bx - call wait_for_key - pushf - xorw %di, %di - call print_kill_line - movw $int19_message_done, %si - call print_message - popf - jz 1f - /* Leave keypress in buffer and start iPXE. The keypress will - * cause the usual initial Ctrl-B prompt to be skipped. - */ - orl $0xffffffff, %ebp /* Allow arbitrary relocation */ - pushw %cs - call exec -1: /* Try to call original INT 19 vector */ - movl %cs:orig_int19, %eax - testl %eax, %eax - je 2f - ljmp *%cs:orig_int19 -2: /* No chained vector: issue INT 18 as a last resort */ - int $0x18 - .size int19_entry, . - int19_entry -orig_int19: - .long 0 - .size orig_int19, . - orig_int19 - -int19_message_prompt: - .asciz "Press N to skip booting from " - .size int19_message_prompt, . - int19_message_prompt -int19_message_dots: - .asciz "..." - .size int19_message_dots, . - int19_message_dots -int19_message_done: - .asciz "\n\n" - .size int19_message_done, . - int19_message_done - -/* Execute as a boot device - * - */ -exec: /* Set %ds = %cs */ - pushw %cs - popw %ds - - /* Print message as soon as possible */ - movw $prodstr, %si - xorw %di, %di - call print_message - movw $exec_message_pre_install, %si - call print_message - - /* Store magic word on BIOS stack and remember BIOS %ss:sp */ - pushl $STACK_MAGIC - movw %ss, %cx - movw %sp, %dx - - /* Obtain a reasonably-sized temporary stack */ - xorw %bx, %bx - movw %bx, %ss - movw $0x7c00, %sp - - /* Install iPXE */ - call alloc_basemem - movl image_source, %esi - movl decompress_to, %edi - call install_prealloc - - /* Print message indicating successful installation */ - movw $exec_message_post_install, %si - xorw %di, %di - call print_message - - /* Set up real-mode stack */ - movw %bx, %ss - movw $_estack16, %sp - - /* Jump to .text16 segment */ - pushw %ax - pushw $1f - lret - .section ".text16", "awx", @progbits -1: - /* Retrieve PCI bus:dev.fn, if applicable */ -.ifeqs BUSTYPE, "PCIR" - movw init_pci_busdevfn, %ax -.endif - - /* Set up %ds for access to .data16 */ - movw %bx, %ds - - /* Store PCI bus:dev.fn, if applicable */ -.ifeqs BUSTYPE, "PCIR" -#ifdef AUTOBOOT_ROM_FILTER - movw %ax, autoboot_busdevfn -#endif /* AUTOBOOT_ROM_FILTER */ -.endif - - /* Call main() */ - pushl $main - pushw %cs - call prot_call - popl %eax /* discard */ - - /* Set up flat real mode for return to BIOS */ - call flatten_real_mode - - /* Uninstall iPXE */ - call uninstall - - /* Restore BIOS stack */ - movw %cx, %ss - movw %dx, %sp - - /* Check magic word on BIOS stack */ - popl %eax - cmpl $STACK_MAGIC, %eax - jne 1f - /* BIOS stack OK: return to caller */ - lret -1: /* BIOS stack corrupt: use INT 18 */ - int $0x18 - .previous - -exec_message_pre_install: - .asciz " starting execution..." - .size exec_message_pre_install, . - exec_message_pre_install -exec_message_post_install: - .asciz "ok\n" - .size exec_message_post_install, . - exec_message_post_install - -/* Wait for key press specified by %bl (masked by %bh) - * - * Used by init and INT19 code when prompting user. If the specified - * key is pressed, it is left in the keyboard buffer. - * - * Returns with ZF set iff specified key is pressed. - */ -wait_for_key: - /* Preserve registers */ - pushw %cx - pushw %ax -1: /* Empty the keyboard buffer before waiting for input */ - movb $0x01, %ah - int $0x16 - jz 2f - xorw %ax, %ax - int $0x16 - jmp 1b -2: /* Wait for a key press */ - movw $ROM_BANNER_TIMEOUT_TICKS, %cx -3: decw %cx - js 99f /* Exit with ZF clear */ - /* Wait for timer tick to be updated */ - call wait_for_tick - /* Check to see if a key was pressed */ - movb $0x01, %ah - int $0x16 - jz 3b - /* Check to see if key was the specified key */ - andb %bh, %al - cmpb %al, %bl - je 99f /* Exit with ZF set */ - /* Not the specified key: remove from buffer and stop waiting */ - pushfw - xorw %ax, %ax - int $0x16 - popfw /* Exit with ZF clear */ -99: /* Restore registers and return */ - popw %ax - popw %cx - ret - .size wait_for_key, . - wait_for_key - -/* Wait for timer tick - * - * Used by wait_for_key - */ -wait_for_tick: - pushl %eax - pushw %fs - movw $0x40, %ax - movw %ax, %fs - movl %fs:(0x6c), %eax -1: pushf - sti - hlt - popf - cmpl %fs:(0x6c), %eax - je 1b - popw %fs - popl %eax - ret - .size wait_for_tick, . - wait_for_tick - -/* Drag in objects via _rom_start */ -REQUIRING_SYMBOL ( _rom_start ) - -/* Drag in ROM configuration */ -REQUIRE_OBJECT ( config_romprefix ) diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/undiloader.S b/qemu/roms/ipxe/src/arch/i386/prefix/undiloader.S deleted file mode 100644 index 5cace44b7..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/undiloader.S +++ /dev/null @@ -1,54 +0,0 @@ -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - - .text - .code16 - .arch i386 - .section ".prefix", "ax", @progbits - -/* UNDI loader - * - * Called by an external program to load our PXE stack. - */ - .globl undiloader -undiloader: - /* Save registers */ - pushl %esi - pushl %edi - pushl %ebp - pushw %ds - pushw %es - pushw %bx - /* ROM segment address to %ds */ - pushw %cs - popw %ds - /* UNDI loader parameter structure address into %es:%di */ - movw %sp, %bx - movw %ss:22(%bx), %di - movw %ss:24(%bx), %es - /* Install to specified real-mode addresses */ - pushw %di - movw %es:12(%di), %bx - movw %es:14(%di), %ax - movl image_source, %esi - movl decompress_to, %edi - orl $0xffffffff, %ebp /* Allow arbitrary relocation */ - call install_prealloc - popw %di - /* Call UNDI loader C code */ - pushl $pxe_loader_call - pushw %cs - pushw $1f - pushw %ax - pushw $prot_call - lret -1: popw %bx /* discard */ - popw %bx /* discard */ - /* Restore registers and return */ - popw %bx - popw %es - popw %ds - popl %ebp - popl %edi - popl %esi - lret - .size undiloader, . - undiloader diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/unlzma.S b/qemu/roms/ipxe/src/arch/i386/prefix/unlzma.S deleted file mode 100644 index 8d4b3c1a8..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/unlzma.S +++ /dev/null @@ -1,942 +0,0 @@ -/* - * Copyright (C) 2015 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements. - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); - -/**************************************************************************** - * - * This file provides the decompress() and decompress16() functions - * which can be called in order to decompress an LZMA-compressed - * image. The code is modelled on the public-domain "XZ Embedded" - * implementation as used by the Linux kernel. Symbol names are - * chosen to match the XZ Embedded implementation where possible, for - * ease of reference. - * - * This code is optimised for size rather than speed, since the amount - * of data to be decompressed is trivially small by modern standards. - * - * The same basic assembly code is used to compile both decompress() - * and decompress16(). - * - * Note that these functions require large amounts of stack space. - * - **************************************************************************** - */ - - .text - .arch i586 - .section ".prefix.lib", "ax", @progbits - -#ifdef CODE16 -#define ADDR16 -#define ADDR32 addr32 -#define decompress decompress16 - .code16 -#else /* CODE16 */ -#define ADDR16 addr16 -#define ADDR32 - .code32 -#endif /* CODE16 */ - -/**************************************************************************** - * Debugging - **************************************************************************** - * - * This code will usually run in 16-bit protected mode, in which case - * only the 0xe9 debug port (present on some virtual machines) can be - * used. - * - * To debug on real hardware, build with DEBUG=libprefix. This will - * cause this code to be called in flat real mode, and so DEBUG_INT10 - * may be used. - */ - -/* Enable debugging via 0xe9 debug port */ -#define DEBUG_E9 0 - -/* Enable debugging via BIOS INT 10 (works only when in flat real mode) */ -#define DEBUG_INT10 0 - -#if ( DEBUG_E9 || DEBUG_INT10 ) - .macro print_character, reg - pushfl - pushw %ax - pushw %bx - pushw %bp - movb \reg, %al - movw $0x0007, %bx - movb $0x0e, %ah -#if DEBUG_E9 - outb %al, $0xe9 -#endif -#if DEBUG_INT10 - cmpb $('\n'), %al - jne L\@ - int $0x10 - movb $('\r'), %al -L\@: int $0x10 -#endif - popw %bp - popw %bx - popw %ax - popfl - .endm - - .macro print_hex_nibble - pushfl - pushw %ax - cmpb $10, %al - sbb $0x69, %al - das - print_character %al - popw %ax - popfl - .endm - - .macro print_hex_byte, reg - pushfl - pushw %ax - movb \reg, %al - pushw %ax - shrb $4, %al - print_hex_nibble - popw %ax - andb $0x0f, %al - print_hex_nibble - popw %ax - popfl - .endm - - .macro print_hex_word, reg - pushw %ax - movw \reg, %ax - print_hex_byte %ah - print_hex_byte %al - popw %ax - .endm - - .macro print_hex_dword, reg - pushl %eax - movl \reg, %eax - rorl $16, %eax - print_hex_word %ax - rorl $16, %eax - print_hex_word %ax - popl %eax - .endm -#else - .macro print_character, char - .endm - .macro print_hex_byte, reg - .endm - .macro print_hex_word, reg - .endm - .macro print_hex_dword, reg - .endm -#endif - -/**************************************************************************** - * LZMA parameters and data structures - **************************************************************************** - */ - -/* LZMA decompressor states (as used in XZ Embedded) */ -#define STATE_LIT_LIT 0x00 -#define STATE_MATCH_LIT_LIT 0x01 -#define STATE_REP_LIT_LIT 0x02 -#define STATE_SHORTREP_LIT_LIT 0x03 -#define STATE_MATCH_LIT 0x04 -#define STATE_REP_LIT 0x05 -#define STATE_SHORTREP_LIT 0x06 -#define STATE_LIT_MATCH 0x07 -#define STATE_LIT_LONGREP 0x08 -#define STATE_LIT_SHORTREP 0x09 -#define STATE_NONLIT_MATCH 0x0a -#define STATE_NONLIT_REP 0x0b - -/* LZMA maximum decompressor state in which most recent symbol was a literal */ -#define STATE_LIT_MAX 0x06 - -/* LZMA number of literal context bits ("lc=" parameter) */ -#define LZMA_LC 2 - - .struct 0 -lzma_len_dec: -choice: .word 0 -choice2: .word 0 -low: .rept ( 1 << 3 ) - .word 0 - .endr -mid: .rept ( 1 << 3 ) - .word 0 - .endr -high: .rept ( 1 << 8 ) - .word 0 - .endr - .equ sizeof__lzma_len_dec, . - lzma_len_dec - .previous - - .struct 0 -lzma_dec: -out_start: .long 0 -rc_code: .long 0 -rc_range: .long 0 -len: .word 0 -reps: -rep0: .long 0 -rep1: .long 0 -rep2: .long 0 -rep3: .long 0 -probs: -is_match: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -is_rep: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -is_rep0: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -is_rep1: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -is_rep2: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -is_rep0_long: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -dist_slot: .rept ( 4 * ( 1 << 6 ) ) - .word 0 - .endr -dist_special: .rept ( ( 1 << ( 14 / 2 ) ) - 14 ) - .word 0 - .endr -dist_align: .rept ( 1 << 4 ) - .word 0 - .endr -match_len_dec: .space sizeof__lzma_len_dec -rep_len_dec: .space sizeof__lzma_len_dec -literal: .rept ( ( 1 << LZMA_LC ) * 0x300 ) - .word 0 - .endr - .align 4 - .equ sizeof__lzma_dec, . - lzma_dec - .previous - - /* Some binutils versions seem not to handle .struct/.previous */ - .section ".prefix.lib", "ax", @progbits - -/***************************************************************************** - * Normalise range encoder - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * %eax : current range - ***************************************************************************** - */ -rc_normalise: - /* Check if rc_range is less than 1<<24 */ - testb $0xff, (rc_range+3)(%ebp) - jnz 1f - /* If it is, shift in a new byte from the compressed input data */ - shll $8, rc_range(%ebp) - shll $8, rc_code(%ebp) - ADDR32 lodsb - movb %al, (rc_code+0)(%ebp) -1: /* Return current range */ - movl rc_range(%ebp), %eax - ret - .size rc_normalise, . - rc_normalise - -/***************************************************************************** - * Decode single range-encoded bit using a probability estimate - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %ebx : probability estimate pointer (offset from %ebp) - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * CF : decoded bit - * ZF : inverse of decoded bit - * Corrupts: - * none - ***************************************************************************** - */ -rc_bit: - /* Preserve registers */ - pushl %eax - pushl %edx - /* Perform normalisation */ - call rc_normalise - /* Calculate bound in %eax and probability estimate in %dx */ - shrl $11, %eax - movzwl (%ebp,%ebx), %edx - mul %edx /* will zero %edx */ - movw (%ebp,%ebx), %dx - /* Compare code against bound */ - cmpl %eax, rc_code(%ebp) - jae 2f -1: /* Code is less than bound */ - movl %eax, rc_range(%ebp) - negw %dx - addw $(1<<11), %dx - shrw $5, %dx - addw %dx, (%ebp,%ebx) - xorw %ax, %ax /* Clear CF, set ZF */ - jmp 99f -2: /* Code is greater than or equal to bound */ - subl %eax, rc_range(%ebp) - subl %eax, rc_code(%ebp) - shrw $5, %dx - subw %dx, (%ebp,%ebx) - incw %dx /* Clear ZF (%dx is 11-bit; can never wrap) */ - stc /* Set CF */ -99: /* Restore registers and return */ - popl %edx - popl %eax - ret - .size rc_bit, . - rc_bit - -/***************************************************************************** - * Decode MSB-first bittree - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %ebx : probability estimate set pointer (offset from %ebp) - * %cx : number of bits to decode - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * %eax : decoded bittree - * Corrupts: - * none - ***************************************************************************** - */ -rc_bittree: - /* Preserve registers */ - pushl %edi - pushw %cx - movl %ebx, %edi - /* Initialise registers */ - movl $1, %eax -1: /* Decode bit */ - leaw (%edi,%eax,2), %bx /* high word always zero anyway */ - call rc_bit - rclw %ax - ADDR16 loop 1b - /* Restore registers, clear unwanted high bit of result, and return */ - movl %edi, %ebx - popw %cx - popl %edi - btrw %cx, %ax - ret - .size rc_bittree, . - rc_bittree - -/***************************************************************************** - * Decode LSB-first bittree - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %ebx : probability estimate set pointer (offset from %ebp) - * %cx : number of bits to decode - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * %eax : decoded bittree - * Corrupts: - * none - ***************************************************************************** - */ -rc_bittree_reverse: - /* Preserve registers */ - pushw %cx - /* Decode bittree */ - call rc_bittree -1: /* Reverse result */ - rcrb %al - rclb %ah - ADDR16 loop 1b - shrw $8, %ax - /* Restore registers and return */ - popw %cx - ret - .size rc_bittree_reverse, . - rc_bittree_reverse - -/***************************************************************************** - * Decode MSB-first bittree with optional match byte - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %ebx : probability estimate set pointer (offset from %ebp) - * %cl : match byte - * %ch : 1 to use match byte, 0 to ignore match byte - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * %eax : decoded bittree - * Corrupts: - * none - ***************************************************************************** - */ -rc_bittree_match: - /* Preserve registers */ - pushl %edi - pushw %cx - pushw %dx - movl %ebx, %edi - /* Initialise registers */ - movl $1, %eax -1: /* Decode bit */ - rolb $1, %cl - movw %cx, %dx - andb %dh, %dl /* match_bit in %dl */ - movw %dx, %bx - addb %bl, %bh - xorb %bl, %bl - addw %ax, %bx /* offset + match_bit + symbol */ - leaw (%edi,%ebx,2), %bx /* high word always zero anyway */ - call rc_bit - rclw %ax - movb %al, %dh - notb %dh - xorb %dh, %dl - andb %dl, %ch /* offset &= ( match_bit ^ bit ) */ - testb %ah, %ah - jz 1b - /* Restore registers, clear unwanted high bit of result, and return */ - movl %edi, %ebx - popw %dx - popw %cx - popl %edi - xorb %ah, %ah - ret - .size rc_bittree_match, . - rc_bittree_match - -/***************************************************************************** - * Decode direct bits (no probability estimates) - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %cx : number of bits to decode - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * %eax : decoded bits - * Corrupts: - * none - ***************************************************************************** - */ -rc_direct: - /* Preserve registers */ - pushl %ebx - pushw %cx - pushl %edx - /* Initialise registers */ - xorl %edx, %edx -1: /* Perform normalisation */ - call rc_normalise - /* Decode bit */ - shrl $1, %eax - movl %eax, rc_range(%ebp) - movl rc_code(%ebp), %ebx - subl %eax, %ebx - js 2f - movl %ebx, rc_code(%ebp) -2: rcll %ebx - rcll %edx - xorb $1, %dl - ADDR16 loop 1b - /* Restore registers and return */ - movl %edx, %eax - popl %edx - popw %cx - popl %ebx - ret - .size rc_direct, . - rc_direct - -/***************************************************************************** - * Decode an LZMA literal - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %es:%edi : uncompressed output data pointer - * %edx : LZMA state - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * %es:%edi : uncompressed output data pointer (updated) - * %edx : LZMA state - * CF : end of payload marker found (always zero) - * Corrupts: - * %eax - * %ebx - * %ecx - ***************************************************************************** - * - * Literals are coded as an eight-bit tree, using a match byte if the - * previous symbol was not a literal. - * - */ -lzma_literal: - /* Get most recent output byte, if available */ - xorl %ebx, %ebx - cmpl %edi, out_start(%ebp) - je 1f - movb %es:-1(%edi), %bh -1: /* Locate probability estimate set */ - shrb $( 8 - LZMA_LC ), %bh - shlb $1, %bh - leaw literal(%ebx,%ebx,2), %bx - /* Get match byte, if applicable */ - xorw %cx, %cx - cmpb $STATE_LIT_MAX, %dl - jbe 1f - movl rep0(%ebp), %eax - notl %eax - movb %es:(%edi,%eax), %cl - movb $1, %ch -1: /* Decode bittree */ - call rc_bittree_match - /* Store output byte */ - ADDR32 stosb - print_hex_byte %al - print_character $(' ') - /* Update LZMA state */ - subb $3, %dl - jns 1f - xorb %dl, %dl -1: cmpb $7, %dl - jb 1f - subb $3, %dl -1: /* Clear CF and return */ - clc - ret - .size lzma_literal, . - lzma_literal - -/***************************************************************************** - * Decode an LZMA length - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %ebx : length parameter pointer (offset from %ebp) - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * Corrupts: - * %ebx - ***************************************************************************** - * - * Lengths are encoded as: - * - * "0" + 3 bits : lengths 2-9 ("low") - * "10" + 3 bits : lengths 10-17 ("mid") - * "11" + 8 bits : lengths 18-273 ("high") - */ -lzma_len: - /* Preserve registers */ - pushl %eax - pushl %ecx - pushl %edi - movl %ebx, %edi - /* Start by assuming three bits and a base length of 2 */ - movw $3, %cx - movw $2, len(%ebp) - /* Check low-length choice bit */ - leal choice(%edi), %ebx - call rc_bit - leal low(%edi), %ebx - jz 1f - /* Check high-length choice bit */ - leal choice2(%edi), %ebx - call rc_bit - leal mid(%edi), %ebx - movb $10, len(%ebp) - jz 1f - leal high(%edi), %ebx - movb $8, %cl - movb $18, len(%ebp) -1: /* Get encoded length */ - call rc_bittree - addw %ax, len(%ebp) - /* Restore registers and return */ - movl %edi, %ebx - popl %edi - popl %ecx - popl %eax - ret - .size lzma_len, . - lzma_len - -/***************************************************************************** - * Copy (possibly repeated) matched data - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %es:%edi : uncompressed output data pointer - * %cl : repeated match distance index (for repeated matches) - * %eax : match distance (for non-repeated matches) - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * %es:%edi : uncompressed output data pointer - * CF : match distance is out of range - * Corrupts: - * %eax - * %ebx - * %ecx - ***************************************************************************** - */ -match: /* Update repeated match list */ - print_character $('[') - movl $3, %ecx - jmp 1f -match_rep: - print_character $('[') - print_character $('R') - print_hex_byte %cl - print_character $('=') - movzbl %cl, %ecx - movl reps(%ebp,%ecx,4), %eax - jcxz 2f -1: movl (reps-4)(%ebp,%ecx,4), %ebx - movl %ebx, reps(%ebp,%ecx,4) - loop 1b - movl %eax, rep0(%ebp) -2: /* Preserve registers */ - pushl %esi - /* Get stored match length */ - movzwl len(%ebp), %ecx - print_hex_dword %eax - print_character $('+') - print_hex_word %cx - print_character $(']') - print_character $(' ') - /* Abort with CF set if match distance is out of range */ - movl out_start(%ebp), %esi - negl %esi - leal -1(%edi,%esi), %esi - cmpl %eax, %esi - jc 99f - /* Perform copy */ - notl %eax - leal (%edi,%eax), %esi - ADDR32 es rep movsb -99: /* Restore registers and return */ - popl %esi - ret - .size match, . - match - -/***************************************************************************** - * Decode an LZMA match - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %es:%edi : uncompressed output data pointer - * %edx : LZMA state - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * %es:%edi : uncompressed output data pointer - * %edx : LZMA state - * CF : end of payload marker found - * Corrupts: - * %eax - * %ebx - * %ecx - ***************************************************************************** - * - * Matches are encoded as an LZMA length followed by a 6-bit "distance - * slot" code, 0-26 fixed-probability bits, and 0-5 context encoded - * bits. - */ -lzma_match: - /* Preserve registers */ - pushl %edi - /* Update LZMA state */ - cmpb $STATE_LIT_MAX, %dl - movb $STATE_LIT_MATCH, %dl - jbe 1f - movb $STATE_NONLIT_MATCH, %dl -1: /* Decode length */ - movl $match_len_dec, %ebx - call lzma_len - /* Decode distance slot */ - movw len(%ebp), %bx - subw $2, %bx - cmpw $4, %bx - jb 1f - movw $3, %bx -1: shlw $7, %bx - addw $dist_slot, %bx - movw $6, %cx - call rc_bittree - /* Distance slots 0-3 are literal distances */ - cmpb $4, %al - jb 99f - /* Determine initial bits: 10/11 for even/odd distance codes */ - movl %eax, %edi - andw $1, %di - orw $2, %di - /* Determine number of context-encoded bits */ - movw %ax, %cx - shrb $1, %cl - decb %cl - /* Select context to be used in absence of fixed-probability bits */ - movl %edi, %ebx - shlw %cl, %bx - subw %ax, %bx - leaw (dist_special-2)(%ebx,%ebx), %bx - /* Decode fixed-probability bits, if any */ - cmpb $6, %cl - jb 1f - subb $4, %cl - shll %cl, %edi - call rc_direct - orl %eax, %edi - /* Select context to be used in presence of fixed-probability bits */ - movb $4, %cl - movl $dist_align, %ebx -1: /* Decode context-encoded bits */ - shll %cl, %edi - call rc_bittree_reverse - orl %edi, %eax -99: /* Restore registers and tail-call */ - popl %edi - jmp match - .size lzma_match, . - lzma_match - -/***************************************************************************** - * Decode an LZMA repeated match - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %es:%edi : uncompressed output data pointer - * %edx : LZMA state - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * %es:%edi : uncompressed output data pointer - * %edx : LZMA state - * CF : end of payload marker found - * Corrupts: - * %eax - * %ebx - * %ecx - ***************************************************************************** - * - * Repeated matches are encoded as: - * - * "00" : shortrep0 (implicit length 1) - * "01" + len : longrep0 - * "10" + len : longrep1 - * "110" + len : longrep2 - * "111" + len : longrep3 - */ -lzma_rep_match: - /* Initially assume longrep0 */ - movw $(STATE_LIT_LONGREP << 8), %cx - /* Get is_rep0 bit */ - leal is_rep0(,%edx,2), %ebx - call rc_bit - jnz 1f - /* Get is_rep0_long bit */ - leal is_rep0_long(,%edx,2), %ebx - call rc_bit - jnz 98f - movw $1, len(%ebp) - movb $STATE_LIT_SHORTREP, %ch - jmp 99f -1: /* Get is_rep1 bit */ - incb %cl - leal is_rep1(,%edx,2), %ebx - call rc_bit - jz 98f - /* Get is_rep2 bit */ - incb %cl - leal is_rep2(,%edx,2), %ebx - call rc_bit - adcb $0, %cl -98: /* Decode length */ - movl $rep_len_dec, %ebx - call lzma_len -99: /* Update LZMA state */ - cmpb $STATE_LIT_MAX, %dl - movb %ch, %dl - jbe 1f - movb $STATE_NONLIT_REP, %dl -1: /* Tail call */ - jmp match_rep - .size lzma_match, . - lzma_match - -/***************************************************************************** - * Decode one LZMA symbol - * - * Parameters: - * %ss:%ebp : LZMA parameter block - * %ds:%esi : compressed input data pointer - * %es:%edi : uncompressed output data pointer - * %edx : LZMA state - * Returns: - * %ds:%esi : compressed input data pointer (possibly updated) - * %es:%edi : uncompressed output data pointer (updated) - * %edx : LZMA state - * CF : end of payload marker found - * Corrupts: - * %eax - * %ebx - * %ecx - ***************************************************************************** - */ -lzma_decode: - /* Get is_match bit */ - leal is_match(,%edx,2), %ebx - call rc_bit - jz lzma_literal - /* Get is_rep bit */ - leal is_rep(,%edx,2), %ebx - call rc_bit - jz lzma_match - jmp lzma_rep_match - .size lzma_decode, . - lzma_decode - -/**************************************************************************** - * Undo effect of branch-call-jump (BCJ) filter - * - * Parameters: - * %es:%esi : start of uncompressed output data (note %es) - * %es:%edi : end of uncompressed output data - * Returns: - * Corrupts: - * %eax - * %ebx - * %ecx - * %edx - * %esi - ***************************************************************************** - */ -bcj_filter: - /* Store (negative) start of data in %edx */ - movl %esi, %edx - negl %edx - /* Calculate limit in %ecx */ - leal -5(%edi,%edx), %ecx -1: /* Calculate offset in %ebx */ - leal (%esi,%edx), %ebx - /* Check for end of data */ - cmpl %ecx, %ebx - ja 99f - /* Check for an opcode which would be followed by a rel32 address */ - ADDR32 es lodsb - andb $0xfe, %al - cmpb $0xe8, %al - jne 1b - /* Get current jump target value in %eax */ - ADDR32 es lodsl - /* Convert absolute addresses in the range [0,limit) back to - * relative addresses in the range [-offset,limit-offset). - */ - cmpl %ecx, %eax - jae 2f - subl %ebx,%es:-4(%esi) -2: /* Convert negative numbers in the range [-offset,0) back to - * positive numbers in the range [limit-offset,limit). - */ - notl %eax /* Range is now [0,offset) */ - cmpl %ebx, %eax - jae 1b - addl %ecx,%es:-4(%esi) - jmp 1b -99: /* Return */ - ret - .size bcj_filter, . - bcj_filter - -/**************************************************************************** - * decompress (real-mode or 16/32-bit protected-mode near call) - * - * Decompress data - * - * Parameters (passed via registers): - * %ds:%esi : Start of compressed input data - * %es:%edi : Start of output buffer - * Returns: - * %ds:%esi - End of compressed input data - * %es:%edi - End of decompressed output data - * All other registers are preserved - * - * NOTE: It would be possible to build a smaller version of the - * decompression code for -DKEEP_IT_REAL by using 16-bit registers - * where possible. - **************************************************************************** - */ - .globl decompress -decompress: - /* Preserve registers */ - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %ebp - /* Allocate parameter block */ - subl $sizeof__lzma_dec, %esp - movl %esp, %ebp - /* Zero parameter block and set all probabilities to 0.5 */ - pushl %edi - pushw %es - pushw %ss - popw %es - movl %ebp, %edi - xorl %eax, %eax - movl $( sizeof__lzma_dec / 4 ), %ecx - ADDR32 rep stosl - leal probs(%ebp), %edi - movw $( ( 1 << 11 ) / 2 ), %ax - movl $( ( sizeof__lzma_dec - probs ) / 2 ), %ecx - ADDR32 rep stosw - popw %es - popl %edi - /* Initialise remaining parameters */ - movl %edi, out_start(%ebp) - print_character $('\n') - ADDR32 lodsb /* discard initial byte */ - print_hex_byte %al - ADDR32 lodsl - bswapl %eax - print_hex_dword %eax - print_character $('\n') - movl %eax, rc_code(%ebp) - decl rc_range(%ebp) - movl $STATE_LIT_LIT, %edx -1: /* Decompress until we reach end of buffer */ - call lzma_decode - jnc 1b - call rc_normalise - print_character $('\n') - /* Undo BCJ filter */ - pushl %esi - movl out_start(%ebp), %esi - call bcj_filter - popl %esi - /* Restore registers and return */ - addl $sizeof__lzma_dec, %esp - popl %ebp - popl %edx - popl %ecx - popl %ebx - popl %eax - ret - - /* Specify minimum amount of stack space required */ - .globl _min_decompress_stack - .equ _min_decompress_stack, ( sizeof__lzma_dec + 512 /* margin */ ) diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/unlzma16.S b/qemu/roms/ipxe/src/arch/i386/prefix/unlzma16.S deleted file mode 100644 index 32b43f0dc..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/unlzma16.S +++ /dev/null @@ -1,9 +0,0 @@ -/* - * 16-bit version of the decompressor - * - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - -#define CODE16 -#include "unlzma.S" diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/usbdisk.S b/qemu/roms/ipxe/src/arch/i386/prefix/usbdisk.S deleted file mode 100644 index 9676406e2..000000000 --- a/qemu/roms/ipxe/src/arch/i386/prefix/usbdisk.S +++ /dev/null @@ -1,34 +0,0 @@ -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - - .text - .arch i386 - .section ".prefix", "awx", @progbits - .code16 - .org 0 - -#include "mbr.S" - -/* Partition table: 64 heads, 32 sectors/track (ZIP-drive compatible) */ - .org 446 - .space 16 - .space 16 - /* Partition 3: log partition (for CONSOLE_INT13) */ - .byte 0x00, 0x01, 0x01, 0x00 - .byte 0xe0, 0x3f, 0x20, 0x00 - .long 0x00000020 - .long 0x000007e0 - /* Partition 4: boot partition */ - .byte 0x80, 0x00, 0x01, 0x01 - .byte 0xeb, 0x3f, 0x20, 0x02 - .long 0x00000800 - .long 0x00001000 - - .org 510 - .byte 0x55, 0xaa - -/* Skip to start of log partition */ - .org 32 * 512 - .ascii "iPXE LOG\n\n" - -/* Skip to start of boot partition */ - .org 2048 * 512 |