|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)srt0.c 7.6 (Berkeley) 11/8/88 ! 7: */ ! 8: ! 9: #include "../vax/mtpr.h" ! 10: #define LOCORE ! 11: #include "../vax/cpu.h" ! 12: ! 13: /* ! 14: * Startup code for standalone system ! 15: * Non-relocating version -- for programs which are loaded by boot ! 16: * Relocating version for boot* ! 17: */ ! 18: ! 19: .globl _end ! 20: .globl _edata ! 21: .globl _main ! 22: .globl __rtt ! 23: .globl _configure ! 24: .globl _cpu ! 25: .globl _openfirst ! 26: .globl _boothowto ! 27: .globl _bootdev ! 28: ! 29: .set HIGH,31 # mask for total disable ! 30: ! 31: entry: .globl entry ! 32: nop; nop # .word 0x0101 ! 33: mtpr $HIGH,$IPL # just in case ! 34: ! 35: #ifdef REL ! 36: # we need to do special stuff on microvaxen ! 37: mfpr $SID,r0 ! 38: cmpzv $24,$8,r0,$VAX_630 ! 39: beql 1f ! 40: cmpzv $24,$8,r0,$VAX_650 ! 41: bneq 2f ! 42: ! 43: /* ! 44: * Were we booted by VMB? If so, r11 is not boothowto, ! 45: * but rather the address of the `Extended RPB' (see KA630 ! 46: * User's Manual, pp 3-21). These tests were devised by ! 47: * richl@tektronix, 11/10/87. ! 48: */ ! 49: 1: ! 50: cmpl (r11),r11 # if boothowto, r11 will be small ! 51: bneq 2f # and these will not fault ! 52: cmpl 4(r11),$0 ! 53: bneq 2f ! 54: cmpl 8(r11),$-1 ! 55: bneq 2f ! 56: tstl 0xc(r11) ! 57: bneq 2f ! 58: ! 59: /* ! 60: * Booted by VMB: get flags from extended rpb. ! 61: * We can only guess at the boot device (here ra(0,0)). ! 62: */ ! 63: movl 0x30(r11),r11 ! 64: movl $9,r10 # device = ra(0,0) ! 65: 2: ! 66: movl $RELOC,sp ! 67: #else ! 68: movl $RELOC-0x2400,sp ! 69: #endif ! 70: start: ! 71: #ifndef REL ! 72: /* ! 73: * Clear bss segment ! 74: */ ! 75: movl aedata,r0 ! 76: clr: ! 77: clrl (r0)+ ! 78: cmpl r0,sp ! 79: jlss clr ! 80: #else ! 81: /* ! 82: * `entry' below generates a pc-relative reference to the ! 83: * code, so this works no matter where we are now. ! 84: * Clear bss segment *after* moving text and data. ! 85: */ ! 86: movc3 aedata,entry,(sp) ! 87: dclr: ! 88: clrl (r3)+ ! 89: cmpl r3,$_end ! 90: jlss dclr ! 91: /* this loop shouldn't be necessary, but is when booting from an ra81 */ ! 92: xclr: ! 93: clrl (r3)+ ! 94: cmpl r3,$0x100000 ! 95: jlss xclr ! 96: jmp *abegin ! 97: begin: ! 98: #endif ! 99: movl r11,_boothowto ! 100: movl r10,_bootdev ! 101: again: ! 102: mtpr $0,$SCBB ! 103: calls $0,_configure ! 104: movl $1,_openfirst ! 105: calls $0,_main ! 106: #ifdef REL ! 107: jmp again ! 108: #else ! 109: ret ! 110: #endif ! 111: ! 112: .data ! 113: #ifdef REL ! 114: abegin: .long begin ! 115: aedata: .long _edata-RELOC ! 116: #else ! 117: aedata: .long _edata ! 118: #endif ! 119: _bootdev: .long 0 ! 120: _boothowto: .long 0 ! 121: .text ! 122: ! 123: __rtt: ! 124: .word 0x0 ! 125: #ifdef REL ! 126: halt ! 127: #else ! 128: jmp start ! 129: #endif ! 130: ! 131: .globl _badaddr ! 132: _badaddr: ! 133: .word 0 ! 134: movl $1,r0 ! 135: movl 4(ap),r3 ! 136: movl 8(ap),r4 ! 137: movl $4,r2 ! 138: movab 9f,(r2) ! 139: bbc $0,r4,1f; tstb (r3) ! 140: 1: bbc $1,r4,1f; tstw (r3) ! 141: 1: bbc $2,r4,1f; tstl (r3) ! 142: 1: clrl r0 # made it w/o machine checks ! 143: 2: movl $4,r2 ! 144: clrl (r2) ! 145: ret ! 146: .align 2 ! 147: 9: ! 148: casel _cpu,$1,$VAX_MAX ! 149: 0: ! 150: .word 8f-0b # 1 is 780 ! 151: .word 5f-0b # 2 is 750 ! 152: .word 5f-0b # 3 is 730 ! 153: .word 6f-0b # 4 is 8600 ! 154: .word 5f-0b # 5 is 8200 ! 155: .word 1f-0b # 6 is 8800 ! 156: .word 1f-0b # 7 is 610 ! 157: .word 5f-0b # 8 is 630 ! 158: .word 1f-0b # 9 is ??? ! 159: .word 1f-0b # 10 is 650 ! 160: 5: ! 161: mtpr $0xf,$MCESR ! 162: brb 1f ! 163: 6: ! 164: mtpr $0,$EHSR ! 165: brb 1f ! 166: 8: ! 167: mtpr $0,$SBIFS ! 168: 1: ! 169: addl2 (sp)+,sp # discard mchchk trash ! 170: movab 2b,(sp) ! 171: rei ! 172: ! 173: /* ! 174: * Short assembly versions of strcmp, strcpy, and strlen ! 175: * that do not use special instructions. ! 176: */ ! 177: .globl _strcmp ! 178: _strcmp: ! 179: .word 0 ! 180: movq 4(ap),r0 ! 181: 0: cmpb (r0),(r1)+ ! 182: bneq 1f ! 183: tstb (r0)+ ! 184: bneq 0b ! 185: clrl r0 ! 186: ret ! 187: 1: cvtbl (r0),r0 ! 188: cvtbl -(r1),r1 ! 189: subl2 r1,r0 ! 190: ret ! 191: ! 192: .globl _strcpy ! 193: _strcpy: ! 194: .word 0 ! 195: movq 4(ap),r0 ! 196: 0: movb (r1)+,(r0)+ ! 197: bneq 0b ! 198: movl 4(ap),r0 ! 199: ret ! 200: ! 201: .globl _strlen ! 202: _strlen: ! 203: .word 0 ! 204: movl 4(ap),r0 ! 205: 0: tstb (r0)+ ! 206: bneq 0b ! 207: decl r0 ! 208: subl2 4(ap),r0 ! 209: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.