141083Swilliam /*- 241083Swilliam * Copyright (c) 1990 The Regents of the University of California. 341083Swilliam * All rights reserved. 441083Swilliam * 541083Swilliam * This code is derived from software contributed to Berkeley by 641083Swilliam * William Jolitz. 741083Swilliam * 841083Swilliam * %sccs.include.noredist.c% 941083Swilliam * 10*48824Swilliam * @(#)srt0.c 7.2 (Berkeley) 04/28/91 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 17*48824Swilliam * 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 26*48824Swilliam .globl _cyloffset 2741083Swilliam 28*48824Swilliam #ifdef SMALL 29*48824Swilliam /* where the disklabel goes if we have one */ 30*48824Swilliam .globl _disklabel 31*48824Swilliam _disklabel: 32*48824Swilliam .space 512 33*48824Swilliam #endif 3441083Swilliam 3541083Swilliam entry: .globl entry 36*48824Swilliam .globl start 37*48824Swilliam 38*48824Swilliam #if defined(REL) && !defined(SMALL) 39*48824Swilliam 40*48824Swilliam /* relocate program and enter at symbol "start" */ 41*48824Swilliam 42*48824Swilliam #movl $entry-RELOC,%esi # from beginning of ram 4341083Swilliam movl $0,%esi 44*48824Swilliam #movl $entry,%edi # to relocated area 45*48824Swilliam movl $ RELOC,%edi # to relocated area 4641083Swilliam # movl $_edata-RELOC,%ecx # this much 4741083Swilliam movl $64*1024,%ecx 4841083Swilliam cld 4941083Swilliam rep 5041083Swilliam movsb 51*48824Swilliam # relocate program counter to relocation base 52*48824Swilliam pushl $start 5341083Swilliam ret 5441083Swilliam #endif 55*48824Swilliam 56*48824Swilliam start: 57*48824Swilliam 58*48824Swilliam /* setup stack pointer */ 59*48824Swilliam 60*48824Swilliam #ifdef REL 61*48824Swilliam leal 4(%esp),%eax /* ignore old pc */ 62*48824Swilliam movl $ RELOC-4*4,%esp 63*48824Swilliam /* copy down boot parameters */ 64*48824Swilliam movl %esp,%ebx 65*48824Swilliam pushl $3*4 66*48824Swilliam pushl %ebx 67*48824Swilliam pushl %eax 68*48824Swilliam call _bcopy 69*48824Swilliam movl %ebx,%esp 70*48824Swilliam #else 71*48824Swilliam /* save old stack state */ 72*48824Swilliam movl %esp,savearea 73*48824Swilliam movl %ebp,savearea+4 74*48824Swilliam movl $ RELOC-0x2400,%esp 75*48824Swilliam #endif 76*48824Swilliam 77*48824Swilliam /* clear memory as needed */ 78*48824Swilliam 79*48824Swilliam movl %esp,%esi 80*48824Swilliam #ifdef REL 81*48824Swilliam 82*48824Swilliam /* 83*48824Swilliam * Clear Bss and up to 64K heap 84*48824Swilliam */ 85*48824Swilliam movl $64*1024,%ebx 86*48824Swilliam movl $_end,%eax # should be movl $_end-_edata but ... 87*48824Swilliam subl $_edata,%eax 88*48824Swilliam addl %ebx,%eax 89*48824Swilliam pushl %eax 90*48824Swilliam pushl $_edata 91*48824Swilliam call _bzero 92*48824Swilliam 93*48824Swilliam /* 94*48824Swilliam * Clear 64K of stack 95*48824Swilliam */ 96*48824Swilliam movl %esi,%eax 97*48824Swilliam subl %ebx,%eax 98*48824Swilliam subl $5*4,%ebx 99*48824Swilliam pushl %ebx 100*48824Swilliam pushl %eax 101*48824Swilliam call _bzero 102*48824Swilliam #else 103*48824Swilliam movl $_edata,%edx 104*48824Swilliam movl %esp,%eax 105*48824Swilliam subl %edx,%eax 106*48824Swilliam pushl %edx 107*48824Swilliam pushl %esp 108*48824Swilliam call _bzero 109*48824Swilliam #endif 110*48824Swilliam movl %esi,%esp 111*48824Swilliam 11241083Swilliam pushl $0 11341083Swilliam popf 114*48824Swilliam 115*48824Swilliam #ifndef SMALL 116*48824Swilliam call _kbdreset /* resets keyboard and gatea20 brain damage */ 117*48824Swilliam #endif 118*48824Swilliam 11941083Swilliam call _main 12041083Swilliam jmp 1f 12141083Swilliam 12241083Swilliam .data 12341083Swilliam _bootdev: .long 0 124*48824Swilliam _cyloffset: .long 0 12541083Swilliam savearea: .long 0,0 # sp & bp to return to 12641083Swilliam .text 127*48824Swilliam #ifndef SMALL 12841083Swilliam .globl _getchar 129*48824Swilliam #endif 13041083Swilliam .globl _wait 13141083Swilliam 13241083Swilliam __rtt: 133*48824Swilliam #ifndef SMALL 13441083Swilliam call _getchar 135*48824Swilliam #else 136*48824Swilliam _exit: 13741083Swilliam pushl $1000000 13841083Swilliam call _wait 13941083Swilliam popl %eax 140*48824Swilliam #endif 14141083Swilliam movl $-7,%eax 14241083Swilliam jmp 1f 143*48824Swilliam #ifndef SMALL 14441083Swilliam _exit: 14541083Swilliam call _getchar 146*48824Swilliam #endif 147*48824Swilliam movl 4(%esp),%eax 14841083Swilliam 1: 14941083Swilliam #ifdef REL 150*48824Swilliam #ifndef SMALL 151*48824Swilliam call _reset_cpu 152*48824Swilliam #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