Annotation of Net2/arch/i386/boot/asm.s, revision 1.1.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: asm.S,v $
                     32:  * Revision 1.1  1993/03/21 18:08:21  cgd
                     33:  * after 0.2.2 "stable" patches applied
                     34:  *
                     35:  * Revision 2.2  92/04/04  11:34:13  rpd
                     36:  *     Fix Intel Copyright as per B. Davies authorization.
                     37:  *     [92/04/03            rvb]
                     38:  *     From 2.5 boot: pruned inb(), outb(), and pzero().
                     39:  *     [92/03/30            rvb]
                     40:  * 
                     41:  * Revision 2.2  91/04/02  14:35:10  mbj
                     42:  *     Added _sp() => where is the stack at. [kupfer]
                     43:  *     Add Intel copyright
                     44:  *     [90/02/09            rvb]
                     45:  * 
                     46:  */
                     47: 
                     48: /*
                     49:   Copyright 1988, 1989, 1990, 1991, 1992 
                     50:    by Intel Corporation, Santa Clara, California.
                     51: 
                     52:                 All Rights Reserved
                     53: 
                     54: Permission to use, copy, modify, and distribute this software and
                     55: its documentation for any purpose and without fee is hereby
                     56: granted, provided that the above copyright notice appears in all
                     57: copies and that both the copyright notice and this permission notice
                     58: appear in supporting documentation, and that the name of Intel
                     59: not be used in advertising or publicity pertaining to distribution
                     60: of the software without specific, written prior permission.
                     61: 
                     62: INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
                     63: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
                     64: IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
                     65: CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
                     66: LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
                     67: NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
                     68: WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     69: */
                     70: 
                     71:        .file "asm.s"
                     72: 
                     73: #include "asm.h"
                     74: 
                     75: 
                     76: CR0_PE_ON      =       0x1
                     77: CR0_PE_OFF     =       0xfffffffe
                     78: 
                     79: .globl _ouraddr
                     80:        .text
                     81: 
                     82: /*
                     83: #
                     84: # real_to_prot()
                     85: #      transfer from real mode to protected mode.
                     86: */
                     87: 
                     88: ENTRY(real_to_prot)
                     89:        # guarantee that interrupt is disabled when in prot mode
                     90:        cli
                     91: 
                     92:        # load the gdtr
                     93:        addr16
                     94:        data32
                     95:        lgdt    EXT(Gdtr)
                     96: 
                     97:        # set the PE bit of CR0
                     98:        mov     %cr0, %eax
                     99: 
                    100:        data32
                    101:        or      $CR0_PE_ON, %eax
                    102:        mov     %eax, %cr0 
                    103: 
                    104:        # make intrasegment jump to flush the processor pipeline and
                    105:        # reload CS register
                    106:        data32
                    107:        ljmp    $0x18, $xprot
                    108: 
                    109: xprot:
                    110:        # we are in USE32 mode now
                    111:        # set up the protective mode segment registers : DS, SS, ES
                    112:        mov     $0x20, %eax
                    113:        movw    %ax, %ds
                    114:        movw    %ax, %ss
                    115:        movw    %ax, %es
                    116: 
                    117:        ret
                    118: 
                    119: /*
                    120: #
                    121: # prot_to_real()
                    122: #      transfer from protected mode to real mode
                    123: # 
                    124: */
                    125: 
                    126: ENTRY(prot_to_real)
                    127: 
                    128:        # set up a dummy stack frame for the second seg change.
                    129:        movl    _ouraddr, %eax
                    130:        sarl    $4, %eax
                    131:        pushw   %ax
                    132:        pushw   $xreal
                    133: 
                    134:        # Change to use16 mode.
                    135:        ljmp    $0x28, $x16
                    136: 
                    137: x16:
                    138:        # clear the PE bit of CR0
                    139:        mov     %cr0, %eax
                    140:        data32
                    141:        and     $CR0_PE_OFF, %eax
                    142:        mov     %eax, %cr0
                    143: 
                    144: 
                    145:        # make intersegment jmp to flush the processor pipeline
                    146:        # using the fake stack frame set up earlier
                    147:        # and reload CS register
                    148:        lret
                    149: 
                    150: 
                    151: xreal:
                    152:        # we are in real mode now
                    153:        # set up the real mode segment registers : DS, SS, ES
                    154:        movw    %cs, %ax
                    155:        movw    %ax, %ds
                    156:        movw    %ax, %ss
                    157:        movw    %ax, %es
                    158: 
                    159:        data32
                    160:        ret
                    161: 
                    162: /*
                    163: #
                    164: # startprog(phyaddr)
                    165: #      start the program on protected mode where phyaddr is the entry point
                    166: #
                    167: */
                    168: 
                    169: ENTRY(startprog)
                    170:        push    %ebp
                    171:        mov     %esp, %ebp
                    172: 
                    173: 
                    174: 
                    175:        # get things we need into registers
                    176:        movl    0x8(%ebp), %ecx         # entry offset 
                    177:        movl    0x0c(%ebp), %eax        # &argv
                    178: 
                    179:        # make a new stack at 0:0xa0000 (big segs)
                    180:        mov     $0x10, %ebx
                    181:        movw    %bx, %ss
                    182:        movl    $0xa0000,%ebx
                    183:        movl    %ebx,%esp
                    184:        
                    185:        
                    186:        # push some number of args onto the stack
                    187:        pushl   $0                      # nominally a cyl offset in the boot.
                    188:        pushl   0x8(%eax)               # argv[2] = bootdev
                    189:        pushl   0x4(%eax)               # argv[1] = howto
                    190:        pushl   $0                      # dummy 'return' address
                    191:        
                    192:        # push on our entry address
                    193:        mov     $0x08, %ebx             # segment
                    194:        pushl   %ebx
                    195:        pushl   %ecx
                    196: 
                    197:        # convert over the other data segs
                    198:        mov     $0x10, %ebx
                    199:        movw    %bx, %ds
                    200:        movw    %bx, %es
                    201: 
                    202:        # convert the PC (and code seg)
                    203:        lret
                    204: /*
                    205: #
                    206: # pbzero( dst, cnt)
                    207: #      where src is a virtual address and dst is a physical address
                    208: */
                    209: 
                    210: ENTRY(pbzero)
                    211:        push    %ebp
                    212:        mov     %esp, %ebp
                    213:        push    %es
                    214:        push    %esi
                    215:        push    %edi
                    216:        push    %ecx
                    217: 
                    218:        cld
                    219: 
                    220:        # set %es to point at the flat segment
                    221:        mov     $0x10, %eax
                    222:        movw    %ax, %es
                    223: 
                    224:        mov     0x8(%ebp), %edi         # destination
                    225:        mov     0xc(%ebp), %ecx         # count
                    226:        mov     $0x0,%eax               # value
                    227: 
                    228:        rep
                    229:        stosb
                    230: 
                    231:        pop     %ecx
                    232:        pop     %edi
                    233:        pop     %esi
                    234:        pop     %es
                    235:        pop     %ebp
                    236: 
                    237:        ret
                    238: /*
                    239: #
                    240: # pcpy(src, dst, cnt)
                    241: #      where src is a virtual address and dst is a physical address
                    242: #
                    243: */
                    244: 
                    245: ENTRY(pcpy)
                    246:        push    %ebp
                    247:        mov     %esp, %ebp
                    248:        push    %es
                    249:        push    %esi
                    250:        push    %edi
                    251:        push    %ecx
                    252: 
                    253:        cld
                    254: 
                    255:        # set %es to point at the flat segment
                    256:        mov     $0x10, %eax
                    257:        movw    %ax, %es
                    258: 
                    259:        mov     0x8(%ebp), %esi         # source
                    260:        mov     0xc(%ebp), %edi         # destination
                    261:        mov     0x10(%ebp), %ecx        # count
                    262: 
                    263:        rep
                    264:        movsb
                    265: 
                    266:        pop     %ecx
                    267:        pop     %edi
                    268:        pop     %esi
                    269:        pop     %es
                    270:        pop     %ebp
                    271: 
                    272:        ret
                    273: 

unix.superglobalmegacorp.com

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