summaryrefslogtreecommitdiff
path: root/package/aboot/src/head.S
diff options
context:
space:
mode:
Diffstat (limited to 'package/aboot/src/head.S')
-rw-r--r--package/aboot/src/head.S173
1 files changed, 173 insertions, 0 deletions
diff --git a/package/aboot/src/head.S b/package/aboot/src/head.S
new file mode 100644
index 000000000..0e624e0da
--- /dev/null
+++ b/package/aboot/src/head.S
@@ -0,0 +1,173 @@
+/*
+ * arch/alpha/boot/head.S
+ *
+ * initial bootloader stuff..
+ */
+
+#include "pal.h"
+
+#include <config.h>
+
+ .set noreorder
+ .globl __start
+ .ent __start
+__start:
+ .prologue 0
+ bis $31,$31,$31
+ br 1f
+ /* room for the initial PCB, which comes here */
+ .quad 0,0,0,0,0,0,0,0
+1: br $27,2f
+2: ldgp $29,0($27)
+ lda $27,main_
+ jsr $26,($27),main_
+ call_pal PAL_halt
+ .end __start
+
+ /* these must appear within first 512 bytes: */
+ .align 3
+ .quad ABOOT_MAGIC
+config_file_partition:
+ .globl config_file_partition
+ .quad CONFIG_FILE_PARTITION
+raw_initrd_size:
+ .globl raw_initrd_size
+ .quad 0
+
+ .align 3
+ .globl wrent
+ .ent wrent
+wrent:
+ .prologue 0
+ call_pal PAL_wrent
+ ret ($26)
+ .end wrent
+
+ .align 3
+ .globl wrkgp
+ .ent wrkgp
+wrkgp:
+ .prologue 0
+ call_pal PAL_wrkgp
+ ret ($26)
+ .end wrkgp
+
+ .align 3
+ .globl tbi
+ .ent tbi
+tbi:
+ .prologue 0
+ call_pal PAL_tbi
+ ret ($26)
+ .end tbi
+
+ .align 3
+ .globl switch_to_osf_pal
+ .ent switch_to_osf_pal
+switch_to_osf_pal:
+ .prologue 0
+ subq $30,128,$30
+ stq $26,0($30)
+ stq $1,8($30) # regs clobbered by swppal
+ stq $2,16($30)
+ stq $3,24($30)
+ stq $4,32($30)
+ stq $5,40($30)
+ stq $6,48($30)
+ stq $7,56($30)
+ stq $8,64($30)
+ stq $9,72($30)
+ stq $10,80($30)
+ stq $11,88($30)
+ stq $12,96($30)
+ stq $13,104($30)
+ stq $14,112($30)
+ stq $15,120($30)
+
+ stq $30,0($17) /* save KSP in PCB (a1) */
+
+ bis $30,$30,$20 /* a4 = KSP */
+ br $17,__do_swppal
+
+ ldq $26,0($30)
+ ldq $1,8($30)
+ ldq $2,16($30)
+ ldq $3,24($30)
+ ldq $4,32($30)
+ ldq $5,40($30)
+ ldq $6,48($30)
+ ldq $7,56($30)
+ ldq $8,64($30)
+ ldq $9,72($30)
+ ldq $10,80($30)
+ ldq $11,88($30)
+ ldq $12,96($30)
+ ldq $13,104($30)
+ ldq $14,112($30)
+ ldq $15,120($30)
+ addq $30,128,$30
+ ret ($26)
+
+__do_swppal:
+ call_pal PAL_swppal
+ .end switch_to_osf_pal
+
+ .align 3
+ .globl dispatch
+ .ent dispatch
+dispatch:
+ .prologue 0
+ subq $30,80,$30
+ stq $26,0($30)
+ stq $29,8($30)
+
+ stq $8,16($30) /* OpenVMS save regs */
+ stq $9,24($30)
+ stq $10,32($30)
+ stq $11,40($30)
+ stq $12,48($30)
+ stq $13,56($30)
+ stq $14,64($30)
+ stq $15,72($30)
+
+ lda $1,0x10000000 /* hwrpb */
+ ldq $2,0xc0($1) /* crb offset */
+ addq $2,$1,$2 /* crb */
+ ldq $27,0($2) /* dispatch procedure value */
+
+ ldq $2,8($27) /* dispatch call address */
+ jsr $26,($2) /* call it (weird VMS call seq) */
+
+ ldq $26,0($30)
+ ldq $29,8($30)
+
+ ldq $8,16($30)
+ ldq $9,24($30)
+ ldq $10,32($30)
+ ldq $11,40($30)
+ ldq $12,48($30)
+ ldq $13,56($30)
+ ldq $14,64($30)
+ ldq $15,72($30)
+
+ addq $30,80,$30
+ ret $31,($26)
+.end dispatch
+
+
+ .align 3
+ .globl halt
+ .ent halt
+halt:
+ .prologue 0
+ call_pal PAL_halt
+ .end halt
+
+ .ent run_kernel
+ .globl run_kernel
+run_kernel:
+ .prologue 0
+ mov $16,$27
+ mov $17,$30
+ jmp $31,($27)
+ .end run_kernel