summaryrefslogtreecommitdiff
path: root/sys/arch/vax/stand/xxboot/start.s
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/vax/stand/xxboot/start.s')
-rw-r--r--sys/arch/vax/stand/xxboot/start.s200
1 files changed, 200 insertions, 0 deletions
diff --git a/sys/arch/vax/stand/xxboot/start.s b/sys/arch/vax/stand/xxboot/start.s
new file mode 100644
index 00000000000..d20753cf901
--- /dev/null
+++ b/sys/arch/vax/stand/xxboot/start.s
@@ -0,0 +1,200 @@
+/* $OpenBSD: start.s,v 1.1 2000/04/27 02:26:27 bjc Exp $ */
+/* $NetBSD: start.s,v 1.2 1999/10/23 14:40:38 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"
+
+#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, _Xmain # call Xmain (gcc workaround)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
+ movl _memsz, r8
+ mnegl $1, ap # Hack to figure out boot device.
+ jmp 2(r6)
+# calls $0,(r6)
+ halt
+
+# A bunch of functions unwanted in boot blocks.
+ENTRY(getchar, 0)
+ halt
+
+ENTRY(putchar, 0)
+ ret
+
+ENTRY(panic, 0)
+ halt