Annotation of qemu/roms/ipxe/src/arch/i386/prefix/exeprefix.S, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (C) 2011 Michael Brown <[email protected]>.
                      3:  *
                      4:  * This program is free software; you can redistribute it and/or
                      5:  * modify it under the terms of the GNU General Public License as
                      6:  * published by the Free Software Foundation; either version 2 of the
                      7:  * License, or any later version.
                      8:  *
                      9:  * This program is distributed in the hope that it will be useful, but
                     10:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     11:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     12:  * General Public License for more details.
                     13:  *
                     14:  * You should have received a copy of the GNU General Public License
                     15:  * along with this program; if not, write to the Free Software
                     16:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     17:  *
                     18:  */
                     19: 
                     20: FILE_LICENCE ( GPL2_OR_LATER )
                     21: 
                     22: /* Initial temporary stack size */
                     23: #define EXE_STACK_SIZE 0x400
                     24: 
                     25: /* Temporary decompression area (avoid DOS high memory area) */
                     26: #define EXE_DECOMPRESS_ADDRESS 0x110000
                     27: 
                     28: /* Fields within the Program Segment Prefix */
                     29: #define PSP_CMDLINE_LEN 0x80
                     30: #define PSP_CMDLINE_START 0x81
                     31: 
                     32:        .text
                     33:        .arch i386
                     34:        .org 0
                     35:        .code16
                     36:        .section ".prefix", "awx", @progbits
                     37: 
                     38: signature:
                     39:        /* "MZ" signature */
                     40:        .ascii  "MZ"
                     41: 
                     42: last_block:
                     43:        /* Number of bytes in last block that are really used */
                     44:        .word   0
                     45: 
                     46: blocks:
                     47:        /* Number of 512-byte blocks */
                     48:        .word   0
                     49:        .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */
                     50:        .ascii  "ADDW"
                     51:        .long   blocks
                     52:        .long   512
                     53:        .long   0
                     54:        .previous
                     55: 
                     56: num_reloc:
                     57:        /* Number of relocation entries stored after the header */
                     58:        .word   0
                     59: 
                     60: header_pgh:
                     61:        /* Number of paragraphs in the header */
                     62:        .word   ( ( _exe_start - signature ) / 16 )
                     63: 
                     64: min_bss_pgh:
                     65:        /* Minimum number of paragraphs of additional (BSS) memory */
                     66:        .word   ( EXE_STACK_SIZE / 16 )
                     67: 
                     68: max_bss_pgh:
                     69:        /* Maximum number of paragraphs of additional (BSS) memory */
                     70:        .word   ( EXE_STACK_SIZE / 16 )
                     71: 
                     72: init_ss:
                     73:        /* Initial stack segment (relative to start of executable) */
                     74:        .word   -( ( _exe_start - signature ) / 16 )
                     75:        .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */
                     76:        .ascii  "ADDW"
                     77:        .long   init_ss
                     78:        .long   16
                     79:        .long   0
                     80:        .previous
                     81: 
                     82: init_sp:
                     83:        /* Initial stack pointer */
                     84:        .word   EXE_STACK_SIZE
                     85: 
                     86: checksum:
                     87:        /* Checksum (ignored) */
                     88:        .word   0
                     89: 
                     90: init_ip:
                     91:        /* Initial instruction pointer */
                     92:        .word   _exe_start
                     93: 
                     94: init_cs:
                     95:        /* Initial code segment (relative to start of executable) */
                     96:        .word   -( ( _exe_start - signature ) / 16 )
                     97: 
                     98: reloc_table:
                     99:        /* Relocation table offset */
                    100:        .word   0
                    101: 
                    102: overlay:
                    103:        /* Overlay number */
                    104:        .word   0
                    105: 
                    106:        .align 16, 0
                    107: 
                    108:        .globl  _exe_start
                    109: _exe_start:
                    110:        /* Install iPXE.  Use a fixed temporary decompression area to
                    111:         * avoid trashing the DOS high memory area.
                    112:         */
                    113:        call    alloc_basemem
                    114:        xorl    %esi, %esi
                    115:        movl    $EXE_DECOMPRESS_ADDRESS, %edi
                    116:        clc
                    117:        call    install_prealloc
                    118: 
                    119:        /* Set up real-mode stack */
                    120:        movw    %bx, %ss
                    121:        movw    $_estack16, %sp
                    122: 
                    123:        /* Jump to .text16 segment */
                    124:        pushw   %ax
                    125:        pushw   $1f
                    126:        lret
                    127:        .section ".text16", "awx", @progbits
                    128: 1:
                    129:        /* Terminate command line with a NUL */
                    130:        movzbw  PSP_CMDLINE_LEN, %si
                    131:        movb    $0, PSP_CMDLINE_START(%si)
                    132: 
                    133:        /* Calculate command line physical address */
                    134:        xorl    %esi, %esi
                    135:        movw    %ds, %si
                    136:        shll    $4, %esi
                    137:        addl    $PSP_CMDLINE_START, %esi
                    138: 
                    139:        /* Set up %ds for access to .data16 */
                    140:        movw    %bx, %ds
                    141: 
                    142:        /* Record command line address */
                    143:        movl    %esi, cmdline_phys
                    144: 
                    145:        /* Run iPXE */
                    146:        pushl   $main
                    147:        pushw   %cs
                    148:        call    prot_call
                    149:        popl    %ecx /* discard */
                    150: 
                    151:        /* Uninstall iPXE */
                    152:        call    uninstall
                    153: 
                    154:        /* Exit back to DOS.  This is very unlikely to work */
                    155:        movw    $0x4c00, %ax
                    156:        int     $0x21

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.