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

1.1       root        1: FILE_LICENCE ( GPL2_OR_LATER )
                      2: 
                      3: #define BOOT_SEG       0x07c0
                      4: #define EXEC_SEG       0x0100
                      5: #define STACK_SEG      0x0200
                      6: #define STACK_SIZE     0x2000
                      7:        
                      8:        .text
                      9:        .arch i386
                     10:        .section ".prefix", "awx", @progbits
                     11:        .code16
                     12: 
                     13: /*
                     14:  * Find active partition
                     15:  *
                     16:  * Parameters:
                     17:  *   %dl       : BIOS drive number
                     18:  *   %bp       : Active partition handler routine
                     19:  */
                     20: find_active_partition:
                     21:        /* Set up stack at STACK_SEG:STACK_SIZE */
                     22:        movw    $STACK_SEG, %ax
                     23:        movw    %ax, %ss
                     24:        movw    $STACK_SIZE, %sp
                     25: 
                     26:        /* Relocate self to EXEC_SEG */
                     27:        pushw   $BOOT_SEG
                     28:        popw    %ds
                     29:        pushw   $EXEC_SEG
                     30:        popw    %es
                     31:        xorw    %si, %si
                     32:        xorw    %di, %di
                     33:        movw    $0x200, %cx
                     34:        rep movsb
                     35:        ljmp    $EXEC_SEG, $1f
                     36: 1:     pushw   %ds
                     37:        popw    %es
                     38:        pushw   %cs
                     39:        popw    %ds
                     40: 
                     41:        /* Check for LBA extensions */
                     42:        movb    $0x41, %ah
                     43:        movw    $0x55aa, %bx
                     44:        stc
                     45:        int     $0x13
                     46:        jc      1f
                     47:        cmpw    $0xaa55, %bx
                     48:        jne     1f
                     49:        movw    $read_lba, read_sectors
                     50: 1:     
                     51:        /* Read and process root partition table */
                     52:        xorb    %dh, %dh
                     53:        movw    $0x0001, %cx
                     54:        xorl    %esi, %esi
                     55:        xorl    %edi, %edi
                     56:        call    process_table
                     57: 
                     58:        /* Print failure message */
                     59:        movw    $10f, %si
                     60:        jmp     boot_error
                     61: 10:    .asciz  "Could not locate active partition\r\n"
                     62: 
                     63: /*
                     64:  * Print failure message and boot next device
                     65:  *
                     66:  * Parameters:
                     67:  *   %si       : Failure string
                     68:  */
                     69: boot_error:
                     70:        cld
                     71:        movw    $0x0007, %bx
                     72:        movb    $0x0e, %ah
                     73: 1:     lodsb
                     74:        testb   %al, %al
                     75:        je      99f
                     76:        int     $0x10
                     77:        jmp     1b
                     78: 99:    /* Boot next device */
                     79:        int     $0x18
                     80: 
                     81: /*
                     82:  * Process partition table
                     83:  *
                     84:  * Parameters:
                     85:  *   %dl       : BIOS drive number
                     86:  *   %dh       : Head
                     87:  *   %cl       : Sector (bits 0-5), high two bits of cylinder (bits 6-7)
                     88:  *   %ch       : Low eight bits of cylinder
                     89:  *   %esi:%edi : LBA address
                     90:  *   %bp       : Active partition handler routine
                     91:  *
                     92:  * Returns:
                     93:  *   CF set on error
                     94:  */
                     95: process_table:
                     96:        pushal
                     97:        call    read_boot_sector
                     98:        jc      99f
                     99:        movw    $446, %bx
                    100: 1:     call    process_partition
                    101:        addw    $16, %bx
                    102:        cmpw    $510, %bx
                    103:        jne     1b
                    104: 99:    popal
                    105:        ret
                    106: 
                    107: /*
                    108:  * Process partition
                    109:  *
                    110:  * Parameters:
                    111:  *   %dl       : BIOS drive number
                    112:  *   %dh       : Head
                    113:  *   %cl       : Sector (bits 0-5), high two bits of cylinder (bits 6-7)
                    114:  *   %ch       : Low eight bits of cylinder
                    115:  *   %esi:%edi : LBA address
                    116:  *   %bx       : Offset within partition table
                    117:  *   %bp       : Active partition handler routine
                    118:  */
                    119: process_partition:
                    120:        pushal
                    121:        /* Load C/H/S values from partition entry */
                    122:        movb    %es:1(%bx), %dh
                    123:        movw    %es:2(%bx), %cx
                    124:        /* Update LBA address from partition entry */
                    125:        addl    %es:8(%bx), %edi
                    126:        adcl    $0, %esi
                    127:        /* Check active flag */
                    128:        testb   $0x80, %es:(%bx)
                    129:        jz      1f
                    130:        call    read_boot_sector
                    131:        jc      99f
                    132:        jmp     *%bp
                    133: 1:     /* Check for extended partition */
                    134:        movb    %es:4(%bx), %al
                    135:        cmpb    $0x05, %al
                    136:        je      2f
                    137:        cmpb    $0x0f, %al
                    138:        je      2f
                    139:        cmpb    $0x85, %al
                    140:        jne     99f
                    141: 2:     call    process_table
                    142: 99:    popal
                    143:        /* Reload original partition table */
                    144:        call    read_boot_sector
                    145:        ret
                    146: 
                    147: /*
                    148:  * Read single sector to %es:0000 and verify 0x55aa signature
                    149:  *
                    150:  * Parameters:
                    151:  *   %dl       : BIOS drive number
                    152:  *   %dh       : Head
                    153:  *   %cl       : Sector (bits 0-5), high two bits of cylinder (bits 6-7)
                    154:  *   %ch       : Low eight bits of cylinder
                    155:  *   %esi:%edi : LBA address
                    156:  *
                    157:  * Returns:
                    158:  *   CF set on error
                    159:  */
                    160: read_boot_sector:
                    161:        pushw   %ax
                    162:        movw    $1, %ax
                    163:        call    *read_sectors
                    164:        jc      99f
                    165:        cmpw    $0xaa55, %es:(510)
                    166:        je      99f
                    167:        stc     
                    168: 99:    popw    %ax
                    169:        ret
                    170:        
                    171: /*
                    172:  * Read sectors to %es:0000
                    173:  *
                    174:  * Parameters:
                    175:  *   %dl       : BIOS drive number
                    176:  *   %dh       : Head
                    177:  *   %cl       : Sector (bits 0-5), high two bits of cylinder (bits 6-7)
                    178:  *   %ch       : Low eight bits of cylinder
                    179:  *   %esi:%edi : LBA address
                    180:  *   %ax       : Number of sectors (max 127)
                    181:  *
                    182:  * Returns:
                    183:  *   CF set on error
                    184:  */
                    185: read_sectors:  .word   read_chs
                    186: 
                    187: read_chs:
                    188:        /* Read sectors using C/H/S address */
                    189:        pushal
                    190:        xorw    %bx, %bx
                    191:        movb    $0x02, %ah
                    192:        stc
                    193:        int     $0x13
                    194:        sti
                    195:        popal
                    196:        ret
                    197: 
                    198: read_lba:
                    199:        /* Read sectors using LBA address */
                    200:        pushal
                    201:        movw    %ax, (lba_desc + 2)
                    202:        pushw   %es
                    203:        popw    (lba_desc + 6)
                    204:        movl    %edi, (lba_desc + 8)
                    205:        movl    %esi, (lba_desc + 12)
                    206:        movw    $lba_desc, %si
                    207:        movb    $0x42, %ah
                    208:        int     $0x13
                    209:        popal
                    210:        ret
                    211: 
                    212: lba_desc:
                    213:        .byte   0x10
                    214:        .byte   0
                    215:        .word   1
                    216:        .word   0x0000
                    217:        .word   0x0000
                    218:        .long   0, 0

unix.superglobalmegacorp.com

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