home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / i386 / stand / srt0.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-28  |  5.2 KB  |  281 lines

  1. /*-
  2.  * Copyright (c) 1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * William Jolitz.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  *    @(#)srt0.c    5.3 (Berkeley) 4/28/91
  37.  */
  38.  
  39. /*
  40.  * Startup code for standalone system
  41.  * Non-relocating version -- for programs which are loaded by boot
  42.  * Relocating version for boot
  43.  * Small relocating version for "micro" boot
  44.  */
  45.  
  46.     .globl    _end
  47.     .globl    _edata
  48.     .globl    _main
  49.     .globl    __rtt
  50.     .globl    _exit
  51.     .globl    _bootdev
  52.     .globl    _cyloffset
  53.  
  54. #ifdef SMALL
  55.     /* where the disklabel goes if we have one */
  56.     .globl    _disklabel
  57. _disklabel:
  58.     .space 512
  59. #endif
  60.  
  61. entry:    .globl    entry
  62.     .globl    start
  63.  
  64. #if    defined(REL) && !defined(SMALL)
  65.  
  66.     /* relocate program and enter at symbol "start" */
  67.  
  68.     #movl    $entry-RELOC,%esi    # from beginning of ram
  69.     movl    $0,%esi
  70.     #movl    $entry,%edi        # to relocated area
  71.     movl    $ RELOC,%edi        # to relocated area
  72.     # movl    $_edata-RELOC,%ecx    # this much
  73.     movl    $64*1024,%ecx
  74.     cld
  75.     rep
  76.     movsb
  77.     # relocate program counter to relocation base
  78.     pushl    $start
  79.     ret
  80. #endif
  81.  
  82. start:
  83.  
  84.     /* setup stack pointer */
  85.  
  86. #ifdef REL
  87.     leal    4(%esp),%eax    /* ignore old pc */
  88.     movl    $ RELOC-4*4,%esp
  89.     /* copy down boot parameters */
  90.     movl    %esp,%ebx
  91.     pushl    $3*4
  92.     pushl    %ebx
  93.     pushl    %eax
  94.     call    _bcopy
  95.     movl    %ebx,%esp
  96. #else
  97.     /* save old stack state */
  98.     movl    %esp,savearea
  99.     movl    %ebp,savearea+4
  100.     movl    $ RELOC-0x2400,%esp
  101. #endif
  102.  
  103.     /* clear memory as needed */
  104.  
  105.     movl    %esp,%esi
  106. #ifdef    REL
  107.  
  108.     /*
  109.      * Clear Bss and up to 64K heap
  110.      */
  111.     movl    $64*1024,%ebx
  112.     movl    $_end,%eax    # should be movl $_end-_edata but ...
  113.     subl    $_edata,%eax
  114.     addl    %ebx,%eax
  115.     pushl    %eax
  116.     pushl    $_edata
  117.     call    _bzero
  118.  
  119.     /*
  120.      * Clear 64K of stack
  121.      */
  122.     movl    %esi,%eax
  123.     subl    %ebx,%eax
  124.     subl    $5*4,%ebx
  125.     pushl    %ebx
  126.     pushl    %eax
  127.     call    _bzero
  128. #else
  129.     movl    $_edata,%edx
  130.     movl    %esp,%eax
  131.     subl    %edx,%eax
  132.     pushl    %edx
  133.     pushl    %esp
  134.     call    _bzero
  135. #endif
  136.     movl    %esi,%esp
  137.  
  138.     pushl    $0
  139.     popf
  140.  
  141. #ifndef    SMALL
  142.     call    _kbdreset    /* resets keyboard and gatea20 brain damage */
  143. #endif
  144.  
  145.     call    _main
  146.     jmp    1f
  147.  
  148.     .data
  149. _bootdev:    .long    0
  150. _cyloffset:    .long    0
  151. savearea:    .long    0,0    # sp & bp to return to
  152.     .text
  153. #ifndef    SMALL
  154.     .globl _getchar
  155. #endif
  156.     .globl _wait
  157.  
  158. __rtt:
  159. #ifndef    SMALL
  160.     call    _getchar
  161. #else
  162. _exit:
  163.     pushl    $1000000
  164.     call    _wait
  165.     popl    %eax
  166. #endif
  167.     movl    $-7,%eax
  168.     jmp    1f
  169. #ifndef    SMALL
  170. _exit:
  171.     call    _getchar
  172. #endif
  173.     movl    4(%esp),%eax
  174. 1:
  175. #ifdef    REL
  176. #ifndef SMALL
  177.     call    _reset_cpu
  178. #endif
  179.     movw    $0x1234,%ax
  180.     movw    %ax,0x472    # warm boot
  181.     movl    $0,%esp        # segment violation
  182.     ret
  183. #else
  184.     movl    savearea,%esp
  185.     movl    savearea+4,%ebp
  186.     ret
  187. #endif
  188.  
  189.     .globl    _inb
  190. _inb:    movl    4(%esp),%edx
  191.     subl    %eax,%eax    # clr eax
  192.     inb    %dx,%al
  193.     ret
  194.  
  195.     .globl    _outb
  196. _outb:    movl    4(%esp),%edx
  197.     movl    8(%esp),%eax
  198.     outb    %al,%dx
  199.     ret
  200.  
  201.     .globl ___udivsi3
  202. ___udivsi3:
  203.     movl 4(%esp),%eax
  204.     xorl %edx,%edx
  205.     divl 8(%esp)
  206.     ret
  207.  
  208.     .globl ___divsi3
  209. ___divsi3:
  210.     movl 4(%esp),%eax
  211.     xorl %edx,%edx
  212.     cltd
  213.     idivl 8(%esp)
  214.     ret
  215.  
  216.     #
  217.     # bzero (base,cnt)
  218.     #
  219.  
  220.     .globl _bzero
  221. _bzero:
  222.     pushl    %edi
  223.     movl    8(%esp),%edi
  224.     movl    12(%esp),%ecx
  225.     movb    $0x00,%al
  226.     cld
  227.     rep
  228.     stosb
  229.     popl    %edi
  230.     ret
  231.  
  232.     #
  233.     # bcopy (src,dst,cnt)
  234.     # NOTE: does not (yet) handle overlapped copies
  235.     #
  236.  
  237.     .globl    _bcopy
  238. _bcopy:
  239.     pushl    %esi
  240.     pushl    %edi
  241.     movl    12(%esp),%esi
  242.     movl    16(%esp),%edi
  243.     movl    20(%esp),%ecx
  244.     cld
  245.     rep
  246.     movsb
  247.     popl    %edi
  248.     popl    %esi
  249.     ret
  250.  
  251.     # insw(port,addr,cnt)
  252.     .globl    _insw
  253. _insw:
  254.     pushl    %edi
  255.     movw    8(%esp),%dx
  256.     movl    12(%esp),%edi
  257.     movl    16(%esp),%ecx
  258.     cld
  259.     nop
  260.     .byte 0x66,0xf2,0x6d    # rep insw
  261.     nop
  262.     movl    %edi,%eax
  263.     popl    %edi
  264.     ret
  265.  
  266.     # outsw(port,addr,cnt)
  267.     .globl    _outsw
  268. _outsw:
  269.     pushl    %esi
  270.     movw    8(%esp),%dx
  271.     movl    12(%esp),%esi
  272.     movl    16(%esp),%ecx
  273.     cld
  274.     nop
  275.     .byte 0x66,0xf2,0x6f    # rep outsw
  276.     nop
  277.     movl    %esi,%eax
  278.     popl    %esi
  279.     ret
  280.  
  281.