141083Swilliam /*- 2*63368Sbostic * Copyright (c) 1990, 1993 3*63368Sbostic * The Regents of the University of California. All rights reserved. 441083Swilliam * 541083Swilliam * This code is derived from software contributed to Berkeley by 641083Swilliam * William Jolitz. 741083Swilliam * 848825Swilliam * %sccs.include.redist.c% 941083Swilliam * 10*63368Sbostic * @(#)srt0.c 8.1 (Berkeley) 06/11/93 1141083Swilliam */ 1241083Swilliam 1341083Swilliam /* 1441083Swilliam * Startup code for standalone system 1541083Swilliam * Non-relocating version -- for programs which are loaded by boot 1641083Swilliam * Relocating version for boot 1748824Swilliam * Small relocating version for "micro" boot 1841083Swilliam */ 1941083Swilliam 2041083Swilliam .globl _end 2141083Swilliam .globl _edata 2241083Swilliam .globl _main 2341083Swilliam .globl __rtt 2441083Swilliam .globl _exit 2541083Swilliam .globl _bootdev 2648824Swilliam .globl _cyloffset 2741083Swilliam 2848824Swilliam #ifdef SMALL 2948824Swilliam /* where the disklabel goes if we have one */ 3048824Swilliam .globl _disklabel 3148824Swilliam _disklabel: 3248824Swilliam .space 512 3348824Swilliam #endif 3441083Swilliam 3541083Swilliam entry: .globl entry 3648824Swilliam .globl start 3748824Swilliam 3848824Swilliam #if defined(REL) && !defined(SMALL) 3948824Swilliam 4048824Swilliam /* relocate program and enter at symbol "start" */ 4148824Swilliam 4248824Swilliam #movl $entry-RELOC,%esi # from beginning of ram 4341083Swilliam movl $0,%esi 4448824Swilliam #movl $entry,%edi # to relocated area 4548824Swilliam movl $ RELOC,%edi # to relocated area 4641083Swilliam # movl $_edata-RELOC,%ecx # this much 4741083Swilliam movl $64*1024,%ecx 4841083Swilliam cld 4941083Swilliam rep 5041083Swilliam movsb 5148824Swilliam # relocate program counter to relocation base 5248824Swilliam pushl $start 5341083Swilliam ret 5441083Swilliam #endif 5548824Swilliam 5648824Swilliam start: 5748824Swilliam 5848824Swilliam /* setup stack pointer */ 5948824Swilliam 6048824Swilliam #ifdef REL 6148824Swilliam leal 4(%esp),%eax /* ignore old pc */ 6248824Swilliam movl $ RELOC-4*4,%esp 6348824Swilliam /* copy down boot parameters */ 6448824Swilliam movl %esp,%ebx 6548824Swilliam pushl $3*4 6648824Swilliam pushl %ebx 6748824Swilliam pushl %eax 6848824Swilliam call _bcopy 6948824Swilliam movl %ebx,%esp 7048824Swilliam #else 7148824Swilliam /* save old stack state */ 7248824Swilliam movl %esp,savearea 7348824Swilliam movl %ebp,savearea+4 7448824Swilliam movl $ RELOC-0x2400,%esp 7548824Swilliam #endif 7648824Swilliam 7748824Swilliam /* clear memory as needed */ 7848824Swilliam 7948824Swilliam movl %esp,%esi 8048824Swilliam #ifdef REL 8148824Swilliam 8248824Swilliam /* 8348824Swilliam * Clear Bss and up to 64K heap 8448824Swilliam */ 8548824Swilliam movl $64*1024,%ebx 8648824Swilliam movl $_end,%eax # should be movl $_end-_edata but ... 8748824Swilliam subl $_edata,%eax 8848824Swilliam addl %ebx,%eax 8948824Swilliam pushl %eax 9048824Swilliam pushl $_edata 9148824Swilliam call _bzero 9248824Swilliam 9348824Swilliam /* 9448824Swilliam * Clear 64K of stack 9548824Swilliam */ 9648824Swilliam movl %esi,%eax 9748824Swilliam subl %ebx,%eax 9848824Swilliam subl $5*4,%ebx 9948824Swilliam pushl %ebx 10048824Swilliam pushl %eax 10148824Swilliam call _bzero 10248824Swilliam #else 10348824Swilliam movl $_edata,%edx 10448824Swilliam movl %esp,%eax 10548824Swilliam subl %edx,%eax 10648824Swilliam pushl %edx 10748824Swilliam pushl %esp 10848824Swilliam call _bzero 10948824Swilliam #endif 11048824Swilliam movl %esi,%esp 11148824Swilliam 11241083Swilliam pushl $0 11341083Swilliam popf 11448824Swilliam 11548824Swilliam #ifndef SMALL 11648824Swilliam call _kbdreset /* resets keyboard and gatea20 brain damage */ 11748824Swilliam #endif 11848824Swilliam 11941083Swilliam call _main 12041083Swilliam jmp 1f 12141083Swilliam 12241083Swilliam .data 12341083Swilliam _bootdev: .long 0 12448824Swilliam _cyloffset: .long 0 12541083Swilliam savearea: .long 0,0 # sp & bp to return to 12641083Swilliam .text 12748824Swilliam #ifndef SMALL 12841083Swilliam .globl _getchar 12948824Swilliam #endif 13041083Swilliam .globl _wait 13141083Swilliam 13241083Swilliam __rtt: 13348824Swilliam #ifndef SMALL 13441083Swilliam call _getchar 13548824Swilliam #else 13648824Swilliam _exit: 13741083Swilliam pushl $1000000 13841083Swilliam call _wait 13941083Swilliam popl %eax 14048824Swilliam #endif 14141083Swilliam movl $-7,%eax 14241083Swilliam jmp 1f 14348824Swilliam #ifndef SMALL 14441083Swilliam _exit: 14541083Swilliam call _getchar 14648824Swilliam #endif 14748824Swilliam movl 4(%esp),%eax 14841083Swilliam 1: 14941083Swilliam #ifdef REL 15048824Swilliam #ifndef SMALL 15148824Swilliam call _reset_cpu 15248824Swilliam #endif 15341083Swilliam movw $0x1234,%ax 15441083Swilliam movw %ax,0x472 # warm boot 15541083Swilliam movl $0,%esp # segment violation 15641083Swilliam ret 15741083Swilliam #else 15841083Swilliam movl savearea,%esp 15941083Swilliam movl savearea+4,%ebp 16041083Swilliam ret 16141083Swilliam #endif 16241083Swilliam 16341083Swilliam .globl _inb 16441083Swilliam _inb: movl 4(%esp),%edx 16541083Swilliam subl %eax,%eax # clr eax 16641083Swilliam inb %dx,%al 16741083Swilliam ret 16841083Swilliam 16941083Swilliam .globl _outb 17041083Swilliam _outb: movl 4(%esp),%edx 17141083Swilliam movl 8(%esp),%eax 17241083Swilliam outb %al,%dx 17341083Swilliam ret 17441083Swilliam 17541083Swilliam .globl ___udivsi3 17641083Swilliam ___udivsi3: 17741083Swilliam movl 4(%esp),%eax 17841083Swilliam xorl %edx,%edx 17941083Swilliam divl 8(%esp) 18041083Swilliam ret 18141083Swilliam 18241083Swilliam .globl ___divsi3 18341083Swilliam ___divsi3: 18441083Swilliam movl 4(%esp),%eax 18541083Swilliam xorl %edx,%edx 18641083Swilliam cltd 18741083Swilliam idivl 8(%esp) 18841083Swilliam ret 18941083Swilliam 19041083Swilliam # 19141083Swilliam # bzero (base,cnt) 19241083Swilliam # 19341083Swilliam 19441083Swilliam .globl _bzero 19541083Swilliam _bzero: 19641083Swilliam pushl %edi 19741083Swilliam movl 8(%esp),%edi 19841083Swilliam movl 12(%esp),%ecx 19941083Swilliam movb $0x00,%al 20041083Swilliam cld 20141083Swilliam rep 20241083Swilliam stosb 20341083Swilliam popl %edi 20441083Swilliam ret 20541083Swilliam 20641083Swilliam # 20741083Swilliam # bcopy (src,dst,cnt) 20841083Swilliam # NOTE: does not (yet) handle overlapped copies 20941083Swilliam # 21041083Swilliam 21141083Swilliam .globl _bcopy 21241083Swilliam _bcopy: 21341083Swilliam pushl %esi 21441083Swilliam pushl %edi 21541083Swilliam movl 12(%esp),%esi 21641083Swilliam movl 16(%esp),%edi 21741083Swilliam movl 20(%esp),%ecx 21841083Swilliam cld 21941083Swilliam rep 22041083Swilliam movsb 22141083Swilliam popl %edi 22241083Swilliam popl %esi 22341083Swilliam ret 22441083Swilliam 22541083Swilliam # insw(port,addr,cnt) 22641083Swilliam .globl _insw 22741083Swilliam _insw: 22841083Swilliam pushl %edi 22941083Swilliam movw 8(%esp),%dx 23041083Swilliam movl 12(%esp),%edi 23141083Swilliam movl 16(%esp),%ecx 23241083Swilliam cld 23341083Swilliam nop 23441083Swilliam .byte 0x66,0xf2,0x6d # rep insw 23541083Swilliam nop 23641083Swilliam movl %edi,%eax 23741083Swilliam popl %edi 23841083Swilliam ret 23941083Swilliam 24041083Swilliam # outsw(port,addr,cnt) 24141083Swilliam .globl _outsw 24241083Swilliam _outsw: 24341083Swilliam pushl %esi 24441083Swilliam movw 8(%esp),%dx 24541083Swilliam movl 12(%esp),%esi 24641083Swilliam movl 16(%esp),%ecx 24741083Swilliam cld 24841083Swilliam nop 24941083Swilliam .byte 0x66,0xf2,0x6f # rep outsw 25041083Swilliam nop 25141083Swilliam movl %esi,%eax 25241083Swilliam popl %esi 25341083Swilliam ret 25441083Swilliam 255