Annotation of qemu/roms/ipxe/src/arch/i386/prefix/lkrnprefix.S, revision 1.1

1.1     ! root        1: /*
        !             2:        Copyright (C) 2000, Entity Cyber, Inc.
        !             3: 
        !             4:        Authors: Gary Byers ([email protected])
        !             5:                 Marty Connor ([email protected])
        !             6: 
        !             7:        This software may be used and distributed according to the terms
        !             8:        of the GNU Public License (GPL), incorporated herein by reference.
        !             9: 
        !            10:        Description:    
        !            11: 
        !            12:        This is just a little bit of code and data that can get prepended
        !            13:        to a ROM image in order to allow bootloaders to load the result
        !            14:        as if it were a Linux kernel image.
        !            15: 
        !            16:        A real Linux kernel image consists of a one-sector boot loader
        !            17:        (to load the image from a floppy disk), followed a few sectors
        !            18:        of setup code, followed by the kernel code itself.  There's
        !            19:        a table in the first sector (starting at offset 497) that indicates
        !            20:        how many sectors of setup code follow the first sector and which
        !            21:        contains some other parameters that aren't interesting in this
        !            22:        case.
        !            23: 
        !            24:        When a bootloader loads the sectors that comprise a kernel image,
        !            25:        it doesn't execute the code in the first sector (since that code
        !            26:        would try to load the image from a floppy disk.)  The code in the
        !            27:        first sector below doesn't expect to get executed (and prints an
        !            28:        error message if it ever -is- executed.)
        !            29: 
        !            30:        We don't require much in the way of setup code.  Historically, the
        !            31:        Linux kernel required at least 4 sectors of setup code.
        !            32:        Therefore, at least 4 sectors must be present even though we don't
        !            33:        use them.
        !            34: 
        !            35: */
        !            36: 
        !            37: FILE_LICENCE ( GPL_ANY )
        !            38: 
        !            39: #define        SETUPSECS 4             /* Minimal nr of setup-sectors */
        !            40: #define PREFIXSIZE ((SETUPSECS+1)*512)
        !            41: #define PREFIXPGH (PREFIXSIZE / 16 )
        !            42: #define        BOOTSEG  0x07C0         /* original address of boot-sector */
        !            43: #define        INITSEG  0x9000         /* we move boot here - out of the way */
        !            44: #define        SETUPSEG 0x9020         /* setup starts here */
        !            45: #define SYSSEG   0x1000                /* system loaded at 0x10000 (65536). */
        !            46: 
        !            47:        .text
        !            48:        .code16
        !            49:        .arch i386
        !            50:        .org    0
        !            51:        .section ".prefix", "ax", @progbits
        !            52:        .globl  _lkrn_start
        !            53: _lkrn_start:
        !            54: /* 
        !            55:        This is a minimal boot sector.  If anyone tries to execute it (e.g., if
        !            56:        a .lilo file is dd'ed to a floppy), print an error message. 
        !            57: */
        !            58: 
        !            59: bootsector: 
        !            60:        jmp     $BOOTSEG, $1f   /* reload cs:ip to match relocation addr */
        !            61: 1:
        !            62:        movw    $0x2000, %di            /*  0x2000 is arbitrary value >= length
        !            63:                                            of bootsect + room for stack */
        !            64: 
        !            65:        movw    $BOOTSEG, %ax
        !            66:        movw    %ax,%ds
        !            67:        movw    %ax,%es
        !            68: 
        !            69:        cli
        !            70:        movw    %ax, %ss                /* put stack at BOOTSEG:0x2000. */
        !            71:        movw    %di,%sp
        !            72:        sti
        !            73: 
        !            74:        movw    $why_end-why, %cx
        !            75:        movw    $why, %si
        !            76: 
        !            77:        movw    $0x0007, %bx            /* page 0, attribute 7 (normal) */
        !            78:        movb    $0x0e, %ah              /* write char, tty mode */
        !            79: prloop: 
        !            80:        lodsb
        !            81:        int     $0x10
        !            82:        loop    prloop
        !            83: freeze: jmp    freeze
        !            84: 
        !            85: why:   .ascii  "This image cannot be loaded from a floppy disk.\r\n"
        !            86: why_end: 
        !            87: 
        !            88: 
        !            89: /*
        !            90:        The following header is documented in the Linux source code at
        !            91:        Documentation/x86/boot.txt
        !            92: */
        !            93:        .org    497
        !            94: setup_sects: 
        !            95:        .byte   SETUPSECS
        !            96: root_flags: 
        !            97:        .word   0
        !            98: syssize: 
        !            99:        .long   -PREFIXPGH
        !           100: 
        !           101:        .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */
        !           102:        .ascii  "ADDL"
        !           103:        .long   syssize
        !           104:        .long   16
        !           105:        .long   0
        !           106:        .previous
        !           107:        
        !           108: ram_size: 
        !           109:        .word   0
        !           110: vid_mode: 
        !           111:        .word   0
        !           112: root_dev: 
        !           113:        .word   0
        !           114: boot_flag: 
        !           115:        .word   0xAA55
        !           116: jump:
        !           117:        /* Manually specify a two-byte jmp instruction here rather
        !           118:         * than leaving it up to the assembler. */
        !           119:        .byte   0xeb
        !           120:        .byte   setup_code - header
        !           121: header:
        !           122:        .byte   'H', 'd', 'r', 'S'
        !           123: version:
        !           124:        .word   0x0207 /* 2.07 */
        !           125: realmode_swtch:
        !           126:        .long   0
        !           127: start_sys:
        !           128:        .word   0
        !           129: kernel_version:
        !           130:        .word   0
        !           131: type_of_loader:
        !           132:        .byte   0
        !           133: loadflags:
        !           134:        .byte   0
        !           135: setup_move_size:
        !           136:        .word   0
        !           137: code32_start:
        !           138:        .long   0
        !           139: ramdisk_image:
        !           140:        .long   0
        !           141: ramdisk_size:
        !           142:        .long   0
        !           143: bootsect_kludge:
        !           144:        .long   0
        !           145: heap_end_ptr:
        !           146:        .word   0
        !           147: pad1:
        !           148:        .word   0
        !           149: cmd_line_ptr:
        !           150:        .long   0
        !           151: initrd_addr_max:
        !           152:        /* We don't use an initrd but some bootloaders (e.g. SYSLINUX) have
        !           153:         * been known to require this field.  Set the value to 2 GB.  This
        !           154:         * value is also used by the Linux kernel. */
        !           155:        .long   0x7fffffff
        !           156: kernel_alignment:
        !           157:        .long   0
        !           158: relocatable_kernel:
        !           159:        .byte   0
        !           160: pad2:
        !           161:        .byte   0, 0, 0
        !           162: cmdline_size:
        !           163:        .long   0
        !           164: hardware_subarch:
        !           165:        .long   0
        !           166: hardware_subarch_data:
        !           167:        .byte   0, 0, 0, 0, 0, 0, 0, 0
        !           168: 
        !           169: /*
        !           170:        We don't need to do too much setup.
        !           171: 
        !           172:        This code gets loaded at SETUPSEG:0.  It wants to start
        !           173:        executing the image that's loaded at SYSSEG:0 and
        !           174:        whose entry point is SYSSEG:0.
        !           175: */
        !           176: setup_code:
        !           177:        /* We expect to be contiguous in memory once loaded.  The Linux image
        !           178:         * boot process requires that setup code is loaded separately from
        !           179:         * "non-real code".  Since we don't need any information that's left
        !           180:         * in the prefix, it doesn't matter: we just have to ensure that
        !           181:         * %cs:0000 is where the start of the image *would* be.
        !           182:         */
        !           183:        ljmp    $(SYSSEG-(PREFIXSIZE/16)), $run_ipxe
        !           184: 
        !           185: 
        !           186:        .org    PREFIXSIZE
        !           187: /*
        !           188:        We're now at the beginning of the kernel proper.
        !           189:  */
        !           190: run_ipxe:
        !           191:        /* Set up stack just below 0x7c00 */
        !           192:        xorw    %ax, %ax
        !           193:        movw    %ax, %ss
        !           194:        movw    $0x7c00, %sp
        !           195: 
        !           196:        /* Retrieve command-line pointer */
        !           197:        movl    %es:cmd_line_ptr, %edx
        !           198: 
        !           199:        /* Install iPXE */
        !           200:        call    install
        !           201: 
        !           202:        /* Set up real-mode stack */
        !           203:        movw    %bx, %ss
        !           204:        movw    $_estack16, %sp
        !           205: 
        !           206:        /* Jump to .text16 segment */
        !           207:        pushw   %ax
        !           208:        pushw   $1f
        !           209:        lret
        !           210:        .section ".text16", "awx", @progbits
        !           211: 1:
        !           212:        /* Set up %ds for access to .data16 */
        !           213:        movw    %bx, %ds
        !           214: 
        !           215:        /* Store command-line pointer */
        !           216:        movl    %edx, cmdline_phys
        !           217: 
        !           218:        /* Run iPXE */
        !           219:        pushl   $main
        !           220:        pushw   %cs
        !           221:        call    prot_call
        !           222:        popl    %ecx /* discard */
        !           223: 
        !           224:        /* Uninstall iPXE */
        !           225:        call    uninstall
        !           226: 
        !           227:        /* Boot next device */
        !           228:        int $0x18

unix.superglobalmegacorp.com

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