1*41083Swilliam /*- 2*41083Swilliam * Copyright (c) 1990 The Regents of the University of California. 3*41083Swilliam * All rights reserved. 4*41083Swilliam * 5*41083Swilliam * This code is derived from software contributed to Berkeley by 6*41083Swilliam * William Jolitz. 7*41083Swilliam * 8*41083Swilliam * %sccs.include.noredist.c% 9*41083Swilliam * 10*41083Swilliam * @(#)srt0.c 7.1 (Berkeley) 04/24/90 11*41083Swilliam */ 12*41083Swilliam 13*41083Swilliam /* 14*41083Swilliam * Startup code for standalone system 15*41083Swilliam * Non-relocating version -- for programs which are loaded by boot 16*41083Swilliam * Relocating version for boot 17*41083Swilliam */ 18*41083Swilliam 19*41083Swilliam .globl _end 20*41083Swilliam .globl _edata 21*41083Swilliam .globl _main 22*41083Swilliam .globl __rtt 23*41083Swilliam .globl _exit 24*41083Swilliam .globl _howto 25*41083Swilliam .globl _bootdev 26*41083Swilliam .globl _unit 27*41083Swilliam 28*41083Swilliam 29*41083Swilliam entry: .globl entry 30*41083Swilliam cli # no interrupts 31*41083Swilliam #ifdef REL 32*41083Swilliam movl $RELOC,%esp 33*41083Swilliam #else 34*41083Swilliam movl %esp,savearea 35*41083Swilliam movl %ebp,savearea+4 36*41083Swilliam movl $RELOC-0x2400,%esp 37*41083Swilliam #endif 38*41083Swilliam movl %esp,%ecx 39*41083Swilliam start: 40*41083Swilliam movl $_edata,%eax 41*41083Swilliam #ifndef foo 42*41083Swilliam #else 43*41083Swilliam subl %eax,%ecx 44*41083Swilliam 1: 45*41083Swilliam movl $0,(%eax) 46*41083Swilliam addl $4,%eax 47*41083Swilliam loopnz 1f 48*41083Swilliam #endif 49*41083Swilliam #ifdef REL 50*41083Swilliam # movl $entry-RELOC,%esi # from beginning of ram 51*41083Swilliam movl $0,%esi 52*41083Swilliam movl $entry,%edi # to relocated area 53*41083Swilliam # movl $_edata-RELOC,%ecx # this much 54*41083Swilliam movl $64*1024,%ecx 55*41083Swilliam cld 56*41083Swilliam rep 57*41083Swilliam movsb 58*41083Swilliam .globl begin 59*41083Swilliam # jmp *$begin -- does not work, why!? 60*41083Swilliam pushl $begin 61*41083Swilliam ret 62*41083Swilliam begin: 63*41083Swilliam #endif 64*41083Swilliam # movl %esi,_howto 65*41083Swilliam # movl %edi,_bootdev 66*41083Swilliam # movl %ebx,_unit 67*41083Swilliam 1: 68*41083Swilliam # calls $0,_configure 69*41083Swilliam movl $1,_openfirst 70*41083Swilliam pushl $0 71*41083Swilliam popf 72*41083Swilliam call _main 73*41083Swilliam #ifdef REL 74*41083Swilliam jmp 1b 75*41083Swilliam #else 76*41083Swilliam jmp 1f 77*41083Swilliam #endif 78*41083Swilliam 79*41083Swilliam .data 80*41083Swilliam _openfirst: .long 0 81*41083Swilliam _bootdev: .long 0 82*41083Swilliam _howto: .long 0 83*41083Swilliam _unit: .long 0 84*41083Swilliam savearea: .long 0,0 # sp & bp to return to 85*41083Swilliam .text 86*41083Swilliam .globl _getchar 87*41083Swilliam .globl _wait 88*41083Swilliam 89*41083Swilliam __rtt: 90*41083Swilliam call _getchar 91*41083Swilliam pushl $1000000 92*41083Swilliam call _wait 93*41083Swilliam popl %eax 94*41083Swilliam movl $-7,%eax 95*41083Swilliam jmp 1f 96*41083Swilliam _exit: 97*41083Swilliam call _getchar 98*41083Swilliam pushl $1000000 99*41083Swilliam call _wait 100*41083Swilliam popl %eax 101*41083Swilliam movl 4(sp),%eax 102*41083Swilliam 1: 103*41083Swilliam #ifdef REL 104*41083Swilliam movw $0x1234,%ax 105*41083Swilliam movw %ax,0x472 # warm boot 106*41083Swilliam movl $0,%esp # segment violation 107*41083Swilliam ret 108*41083Swilliam # jump PA_Monitor # jump to startup code in ROM 109*41083Swilliam #else 110*41083Swilliam movl savearea,%esp 111*41083Swilliam movl savearea+4,%ebp 112*41083Swilliam ret 113*41083Swilliam #endif 114*41083Swilliam .globl _setregs 115*41083Swilliam _setregs: 116*41083Swilliam movl _howto,%esi 117*41083Swilliam movl _bootdev,%edi 118*41083Swilliam movl _unit,%ebx 119*41083Swilliam ret 120*41083Swilliam 121*41083Swilliam .globl _inb 122*41083Swilliam _inb: movl 4(%esp),%edx 123*41083Swilliam subl %eax,%eax # clr eax 124*41083Swilliam nop 125*41083Swilliam inb %dx,%al 126*41083Swilliam nop 127*41083Swilliam ret 128*41083Swilliam 129*41083Swilliam .globl _outb 130*41083Swilliam _outb: movl 4(%esp),%edx 131*41083Swilliam movl 8(%esp),%eax 132*41083Swilliam nop 133*41083Swilliam outb %al,%dx 134*41083Swilliam nop 135*41083Swilliam ret 136*41083Swilliam 137*41083Swilliam .globl ___udivsi3 138*41083Swilliam ___udivsi3: 139*41083Swilliam movl 4(%esp),%eax 140*41083Swilliam xorl %edx,%edx 141*41083Swilliam divl 8(%esp) 142*41083Swilliam ret 143*41083Swilliam 144*41083Swilliam .globl ___divsi3 145*41083Swilliam ___divsi3: 146*41083Swilliam movl 4(%esp),%eax 147*41083Swilliam xorl %edx,%edx 148*41083Swilliam cltd 149*41083Swilliam idivl 8(%esp) 150*41083Swilliam ret 151*41083Swilliam 152*41083Swilliam # 153*41083Swilliam # bzero (base,cnt) 154*41083Swilliam # 155*41083Swilliam 156*41083Swilliam .globl _bzero 157*41083Swilliam _bzero: 158*41083Swilliam pushl %edi 159*41083Swilliam movl 8(%esp),%edi 160*41083Swilliam movl 12(%esp),%ecx 161*41083Swilliam movb $0x00,%al 162*41083Swilliam cld 163*41083Swilliam rep 164*41083Swilliam stosb 165*41083Swilliam popl %edi 166*41083Swilliam ret 167*41083Swilliam 168*41083Swilliam # 169*41083Swilliam # bcopy (src,dst,cnt) 170*41083Swilliam # NOTE: does not (yet) handle overlapped copies 171*41083Swilliam # 172*41083Swilliam 173*41083Swilliam .globl _bcopy 174*41083Swilliam _bcopy: 175*41083Swilliam pushl %esi 176*41083Swilliam pushl %edi 177*41083Swilliam movl 12(%esp),%esi 178*41083Swilliam movl 16(%esp),%edi 179*41083Swilliam movl 20(%esp),%ecx 180*41083Swilliam cld 181*41083Swilliam rep 182*41083Swilliam movsb 183*41083Swilliam popl %edi 184*41083Swilliam popl %esi 185*41083Swilliam ret 186*41083Swilliam 187*41083Swilliam # insw(port,addr,cnt) 188*41083Swilliam .globl _insw 189*41083Swilliam _insw: 190*41083Swilliam pushl %edi 191*41083Swilliam movw 8(%esp),%dx 192*41083Swilliam movl 12(%esp),%edi 193*41083Swilliam movl 16(%esp),%ecx 194*41083Swilliam cld 195*41083Swilliam nop 196*41083Swilliam .byte 0x66,0xf2,0x6d # rep insw 197*41083Swilliam nop 198*41083Swilliam movl %edi,%eax 199*41083Swilliam popl %edi 200*41083Swilliam ret 201*41083Swilliam 202*41083Swilliam # outsw(port,addr,cnt) 203*41083Swilliam .globl _outsw 204*41083Swilliam _outsw: 205*41083Swilliam pushl %esi 206*41083Swilliam movw 8(%esp),%dx 207*41083Swilliam movl 12(%esp),%esi 208*41083Swilliam movl 16(%esp),%ecx 209*41083Swilliam cld 210*41083Swilliam nop 211*41083Swilliam .byte 0x66,0xf2,0x6f # rep outsw 212*41083Swilliam nop 213*41083Swilliam movl %esi,%eax 214*41083Swilliam popl %esi 215*41083Swilliam ret 216*41083Swilliam 217