Annotation of Net2/arch/i386/boot/start.s, revision 1.1

1.1     ! root        1: /*
        !             2:  * Ported to boot 386BSD by Julian Elischer ([email protected]) Sept 1992
        !             3:  *
        !             4:  * Mach Operating System
        !             5:  * Copyright (c) 1992, 1991 Carnegie Mellon University
        !             6:  * All Rights Reserved.
        !             7:  * 
        !             8:  * Permission to use, copy, modify and distribute this software and its
        !             9:  * documentation is hereby granted, provided that both the copyright
        !            10:  * notice and this permission notice appear in all copies of the
        !            11:  * software, derivative works or modified versions, and any portions
        !            12:  * thereof, and that both notices appear in supporting documentation.
        !            13:  * 
        !            14:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            15:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            16:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            17:  * 
        !            18:  * Carnegie Mellon requests users of this software to return to
        !            19:  * 
        !            20:  *  Software Distribution Coordinator  or  [email protected]
        !            21:  *  School of Computer Science
        !            22:  *  Carnegie Mellon University
        !            23:  *  Pittsburgh PA 15213-3890
        !            24:  * 
        !            25:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            26:  * the rights to redistribute these changes.
        !            27:  */
        !            28: 
        !            29: /*
        !            30:  * HISTORY
        !            31:  * $Log: start.S,v $
        !            32:  * Revision 1.1  1993/03/21 18:08:42  cgd
        !            33:  * after 0.2.2 "stable" patches applied
        !            34:  *
        !            35:  * Revision 2.2  92/04/04  11:36:29  rpd
        !            36:  *     Fix Intel Copyright as per B. Davies authorization.
        !            37:  *     [92/04/03            rvb]
        !            38:  *     Need to zero dh on hd path; at least for an adaptec card.
        !            39:  *     [92/01/14            rvb]
        !            40:  * 
        !            41:  *     From 2.5 boot:
        !            42:  *     Flush digit printing.
        !            43:  *     Fuse floppy and hd boot by using Int 21 to tell
        !            44:  *     boot type (slightly dubious since Int 21 is DOS
        !            45:  *     not BIOS)
        !            46:  *     [92/03/30            mg32]
        !            47:  * 
        !            48:  * Revision 2.2  91/04/02  14:42:04  mbj
        !            49:  *     Fix the BIG boot bug.  We had missed a necessary data
        !            50:  *     before a xor that was clearing a register used later
        !            51:  *     as an index register.
        !            52:  *     [91/03/01            rvb]
        !            53:  *     Remember floppy type for swapgeneric
        !            54:  *     Add Intel copyright
        !            55:  *     [90/02/09            rvb]
        !            56:  * 
        !            57:  */
        !            58:  
        !            59: 
        !            60: /*
        !            61:   Copyright 1988, 1989, 1990, 1991, 1992 
        !            62:    by Intel Corporation, Santa Clara, California.
        !            63: 
        !            64:                 All Rights Reserved
        !            65: 
        !            66: Permission to use, copy, modify, and distribute this software and
        !            67: its documentation for any purpose and without fee is hereby
        !            68: granted, provided that the above copyright notice appears in all
        !            69: copies and that both the copyright notice and this permission notice
        !            70: appear in supporting documentation, and that the name of Intel
        !            71: not be used in advertising or publicity pertaining to distribution
        !            72: of the software without specific, written prior permission.
        !            73: 
        !            74: INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
        !            75: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
        !            76: IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
        !            77: CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
        !            78: LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
        !            79: NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
        !            80: WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            81: */
        !            82: #include       "asm.h"
        !            83: 
        !            84:        .file   "start.s"
        !            85: 
        !            86: BOOTSEG                =       0x9000  # boot will be loaded at 640k-64k
        !            87: BOOTSTACK      =       0xe000  # boot stack
        !            88: SIGNATURE      =       0xaa55
        !            89: LOADSZ         =       14      # size of unix boot
        !            90: PARTSTART      =       0x1be   # starting address of partition table
        !            91: NUMPART                =       4       # number of partitions in partition table
        !            92: PARTSZ         =       16      # each partition table entry is 16 bytes
        !            93: BSDPART                =       0xA5    # value of boot_ind, means bootable partition
        !            94: BOOTABLE       =       0x80    # value of boot_ind, means bootable partition
        !            95: 
        !            96:        .text   
        !            97: 
        !            98: ENTRY(boot1)
        !            99: 
        !           100:        # boot1 is loaded at 0x0:0x7c00
        !           101:        # ljmp to the next instruction to set up %cs
        !           102:        data32
        !           103:        ljmp $0x7c0, $start
        !           104: 
        !           105: start:
        !           106:        # set up %ds
        !           107:        mov     %cs, %ax
        !           108:        mov     %ax, %ds
        !           109: 
        !           110: 
        !           111:        # set up %ss and %esp
        !           112:        data32
        !           113:        mov     $BOOTSEG, %eax
        !           114:        mov     %ax, %ss
        !           115:        data32
        !           116:        mov     $BOOTSTACK, %esp
        !           117: 
        !           118:        /*** set up %es, (where we will load boot2 to) ***/
        !           119:        mov     %ax, %es
        !           120: 
        !           121: #ifdef DEBUG
        !           122:        data32
        !           123:        mov     $one, %esi
        !           124:        data32
        !           125:        call    message
        !           126: #endif
        !           127:        # get the boot drive id
        !           128:        movb    $0x33, %ah
        !           129:        movb    $0x05, %al
        !           130:        int     $0x21
        !           131: 
        !           132:        cmpb    $0x80, %dl
        !           133:        data32
        !           134:        jge     hd
        !           135: 
        !           136: fd:
        !           137: #      reset the disk system
        !           138: #ifdef DEBUG
        !           139:        data32
        !           140:        mov     $two, %esi
        !           141:        data32
        !           142:        call    message
        !           143: #endif
        !           144:        movb    $0x0, %ah
        !           145:        int     $0x13
        !           146:        data32
        !           147:        mov     $0x0001, %ecx   # cyl 0, sector 1
        !           148:        data32
        !           149: #ifdef DEBUG
        !           150:        data32
        !           151:        mov     $three, %esi
        !           152:        data32
        !           153:        call    message
        !           154: #endif
        !           155:        jmp load
        !           156: 
        !           157: hd:    /**** load sector 0 into the BOOTSEG ****/
        !           158: #ifdef DEBUG
        !           159:        data32
        !           160:        mov     $four, %esi
        !           161:        data32
        !           162:        call    message
        !           163: #endif
        !           164:        data32
        !           165:        mov     $0x0201, %eax
        !           166:        xor     %ebx, %ebx      # %bx = 0
        !           167:        data32
        !           168:        mov     $0x0001, %ecx
        !           169: #ifdef DEBUG
        !           170:        data32
        !           171:        mov     $five, %esi
        !           172:        data32
        !           173:        call    message
        !           174: #endif
        !           175:        data32
        !           176:        andl    $0xff, %edx
        !           177:        /*mov   $0x0080, %edx*/
        !           178:        int     $0x13
        !           179:        data32
        !           180:        jb      read_error
        !           181: 
        !           182:        /***# find the bootable partition *****/
        !           183:        data32
        !           184:        mov     $PARTSTART, %ebx
        !           185:        data32
        !           186:        mov     $NUMPART, %ecx
        !           187: again:
        !           188:        addr16
        !           189:        movb    %es:4(%ebx), %al
        !           190:        cmpb    $BSDPART, %al
        !           191:        data32
        !           192:        je      found
        !           193:        data32
        !           194:        add     $PARTSZ, %ebx
        !           195:        data32
        !           196:        loop    again
        !           197:        data32
        !           198:        mov     $enoboot, %esi
        !           199:        data32
        !           200:        jmp     err_stop
        !           201: 
        !           202: 
        !           203: /*
        !           204: # BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
        !           205: #       Call with       %ah = 0x2
        !           206: #                       %al = number of sectors
        !           207: #                       %ch = cylinder
        !           208: #                       %cl = sector
        !           209: #                       %dh = head
        !           210: #                       %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
        !           211: #                       %es:%bx = segment:offset of buffer
        !           212: #       Return:
        !           213: #                       %al = 0x0 on success; err code on failure
        !           214: */
        !           215: 
        !           216: found:
        !           217:        addr16
        !           218:        movb    %es:1(%ebx), %dh /* head */
        !           219:        addr16
        !           220:        xor     %ecx, %ecx
        !           221:        addr16
        !           222:        movw    %es:2(%ebx), %ecx /*sect,cyl (+ 2 bytes junk in top word )*/
        !           223: 
        !           224: load:
        !           225:        movb    $0x2, %ah       /* function 2 */
        !           226:        movb    $LOADSZ, %al    /* number of blocks */
        !           227:        xor     %ebx, %ebx      /* %bx = 0, put it at 0 in the BOOTSEG */
        !           228:        int     $0x13
        !           229:        data32
        !           230:        jb      read_error
        !           231: 
        !           232:        # ljmp to the second stage boot loader (boot2).
        !           233:        # After ljmp, %cs is BOOTSEG and boot1 (512 bytes) will be used
        !           234:        # as an internal buffer "intbuf".
        !           235: 
        !           236: #ifdef DEBUG
        !           237:        data32
        !           238:        mov     $six, %esi
        !           239:        data32
        !           240:        call    message
        !           241: #endif
        !           242:        data32
        !           243:        ljmp    $BOOTSEG, $EXT(boot2)
        !           244: 
        !           245: #
        !           246: #      read_error
        !           247: #
        !           248: 
        !           249: read_error:
        !           250: 
        !           251:        data32
        !           252:        mov     $eread, %esi
        !           253: err_stop:
        !           254:        data32
        !           255:        call    message
        !           256:        data32
        !           257:        jmp     stop
        !           258: 
        !           259: #
        !           260: #      message: write the error message in %ds:%esi to console
        !           261: #
        !           262: 
        !           263: message:
        !           264:        # Use BIOS "int 10H Function 0Eh" to write character in teletype mode
        !           265:        #       %ah = 0xe       %al = character
        !           266:        #       %bh = page      %bl = foreground color (graphics modes)
        !           267: 
        !           268:        data32
        !           269:        push    %eax
        !           270:        data32
        !           271:        push    %ebx
        !           272:        data32
        !           273:        mov     $0x0001, %ebx
        !           274:        cld
        !           275: 
        !           276: nextb:
        !           277:        lodsb                   # load a byte into %al
        !           278:        cmpb    $0x0, %al
        !           279:        data32
        !           280:        je      done
        !           281:        movb    $0xe, %ah
        !           282:        int     $0x10           # display a byte
        !           283:        data32
        !           284:        jmp     nextb
        !           285: done:
        !           286:        data32
        !           287:        pop     %ebx
        !           288:        data32
        !           289:        pop     %eax
        !           290:        data32
        !           291:        ret
        !           292: 
        !           293: stop:  hlt
        !           294:        data32
        !           295:        jmp     stop            # halt doesnt actually halt forever
        !           296: 
        !           297: /* error messages */
        !           298: 
        !           299: #ifdef DEBUG
        !           300: one:   String          "1\r\n\0"
        !           301: two:   String          "2\r\n\0"
        !           302: three: String          "3\r\n\0"
        !           303: four:  String          "4\r\n\0"
        !           304: five:  String          "5\r\n\0"
        !           305: six:   String          "6\r\n\0"
        !           306: seven: String          "7\r\n\0"
        !           307: #endif DEBUG
        !           308: eread: String          "Read error\r\n\0"
        !           309: enoboot: String                "No bootable partition\r\n\0"
        !           310: endofcode:
        !           311: /* throw in a partition in case we are block0 as well */
        !           312: /* flag,head,sec,cyl,typ,ehead,esect,ecyl,start,len */
        !           313:        . = EXT(boot1) + PARTSTART
        !           314:        .byte 0x0,0,0,0,0,0,0,0
        !           315:        .long 0,0
        !           316:        .byte 0x0,0,0,0,0,0,0,0
        !           317:        .long 0,0
        !           318:        .byte 0x0,0,0,0,0,0,0,0
        !           319:        .long 0,0
        !           320:        .byte BOOTABLE,0,1,0,BSDPART,255,255,255
        !           321:        .long 0,50000
        !           322: /* the last 2 bytes in the sector 0 contain the signature */
        !           323:        . = EXT(boot1) + 0x1fe
        !           324:        .value  SIGNATURE
        !           325: ENTRY(disklabel)
        !           326:        . = EXT(boot1) + 0x400  

unix.superglobalmegacorp.com

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