NetBSD/sys/arch/vax/boot/start.s

188 lines
6.0 KiB
ArmAsm

/* $NetBSD: start.s,v 1.5 1995/10/20 13:35:41 ragge Exp $ */
/*
* Copyright (c) 1995 Ludd, University of Lule}, Sweden.
* All rights reserved.
*
* This code is derived from software contributed to Ludd by
* Bertram Barth.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed at Ludd, University of
* Lule}, Sweden and its contributors.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* All bugs are subject to removal without further notice */
#define LOCORE
#include "sys/disklabel.h"
#undef LOCORE
#define ASSEMBLER
#include "../include/mtpr.h"
#include "../include/asm.h"
_start: .globl _start # this is the symbolic name for the start
# of code to be relocated. We can use this
# to get the actual/real adress (pc-rel)
# or to get the relocated address (abs).
.org 0x00 # uVAX booted from TK50 starts here
brb from_0x00 # continue behind dispatch-block
.org 0x02 # information used by uVAX-ROM
.byte (LABELOFFSET + d_end_)/2 # offset in words to identification area
.byte 1 # this byte must be 1
.word 0 # logical block number (word swapped)
.word 0 # of the secondary image
.org 0x08 #
brb from_0x08 # skip ...
.org 0x0A # uVAX booted from disk starts here
brb from_0x0A # skip ...
.org 0x0C # 11/750 & 8200 starts here
brw cont_750
from_0x00: # uVAX from TK50
from_0x0A: # uVAX from disk
brw start_uvax # all(?) uVAXen continue there
from_0x08: # What comes here???
halt
.org LABELOFFSET - 6
regmask: .word 0x0fff # using a variable saves 3 bytes !!!
bootinfo: .long 0x0 # another 3 bytes if within byte-offset
# the complete area reserved for label
# must be empty (i.e. filled with zeroes).
# disklabel(8) checks that before installing
# the bootblocks over existing label.
/*
* Parameter block for uVAX boot.
*/
#define VOLINFO 0 /* 1=single-sided 81=double-sided volumes */
#define SISIZE 16 /* size in blocks of secondary image */
#define SILOAD 0 /* load offset (usually 0) from the default */
#define SIOFF 0x0A /* byte offset into secondary image */
.org LABELOFFSET + d_end_
.byte 0x18 # must be 0x18
.byte 0x00 # must be 0x00 (MBZ)
.byte 0x00 # any value
.byte 0xFF - (0x18 + 0x00 + 0x00)
/* 4th byte holds 1s' complement of sum of previous 3 bytes */
.byte 0x00 # must be 0x00 (MBZ)
.byte VOLINFO
.byte 0x00 # any value
.byte 0x00 # any value
.long SISIZE # size in blocks of secondary image
.long SILOAD # load offset (usually 0)
.long SIOFF # byte offset into secondary image
.long (SISIZE + SILOAD + SIOFF) # sum of previous 3
/*
* After bootblock (LBN0) has been loaded into the first page
* of good memory by 11/750's ROM-code (transfer address
* of bootblock-code is: base of good memory + 0x0C) registers
* are initialized as:
* R0: type of boot-device
* 0: Massbus device
* 1: RK06/RK07
* 2: RL02
* 17: UDA50
* 35: TK50
* 64: TU58
* R1: (UBA) address of UNIBUS I/O-page
* (MBA) address of boot device's adapter
* R2: (UBA) address of the boot device's CSR
* (MBA) controller number of boot device
* R6: address of driver subroutine in ROM
*
* cont_750 reads in LBN1-15 for further execution.
*/
.align 2
cont_750:
movl r0,r10
movl r5, ap # ap not used here
clrl r5
clrl r4
movl $_start,sp
1: incl r4
movl r4,r8
addl2 $0x200,r5
cmpl $16,r4
beql 2f
pushl r5
jsb (r6)
blbs r0,1b
2: movl r10, r0
movl r11, r5
brw start_all
start_uvax:
mtpr $0, $PR_MAPEN # Turn off MM, please.
movl $_start, sp
movl 48(r11), ap
brb start_all
/*
* start_all: stack already at RELOC, we save registers, move ourself
* to RELOC and loads boot.
*/
start_all:
pushr $0xfff # save all regs, used later.
subl3 $_start, $_edata, r0 # get size of text+data (w/o bss)
moval _start, r1 # get actual base-address of code
subl3 $_start, $_end, r2 # get complete size (incl. bss)
movl $_start, r3 # get relocated base-address of code
movc5 r0, (r1), $0, r2, (r3) # copy code to new location
movl $relocated, -(sp) # return-address on top of stack
rsb # can be replaced with new address
relocated: # now relocation is done !!!
movl sp, _bootregs
movl ap, _boothowto
calls $0, _main # call main() which is
halt # not intended to return ...
/*
* hoppabort() is called when jumping to the newly loaded program.
*/
ENTRY(hoppabort, 0)
movl 4(ap),r6
movl 8(ap),r11
movl 0xc(ap),r10
calls $0,(r6)
halt