root/arch/alpha/boot/head.S
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * arch/alpha/boot/head.S
 *
 * initial bootloader stuff..
 */

#include <asm/pal.h>

        .set noreorder
        .globl  __start
        .ent    __start
__start:
        br      $29,2f
2:      ldgp    $29,0($29)
        jsr     $26,start_kernel
        call_pal PAL_halt
        .end __start

        .align 5
        .globl  wrent
        .ent    wrent
wrent:
        .prologue 0
        call_pal PAL_wrent
        ret ($26)
        .end wrent

        .align 5
        .globl  wrkgp
        .ent    wrkgp
wrkgp:
        .prologue 0
        call_pal PAL_wrkgp
        ret ($26)
        .end wrkgp

        .align 5
        .globl  switch_to_osf_pal
        .ent    switch_to_osf_pal
switch_to_osf_pal:
        subq    $30,128,$30
        .frame  $30,128,$26
        stq     $26,0($30)
        stq     $1,8($30)
        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)
        .prologue 0

        stq     $30,0($17)      /* save KSP in PCB */

        bis     $30,$30,$20     /* a4 = KSP */
        br      $17,1f

        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)
1:      call_pal PAL_swppal
        .end    switch_to_osf_pal

        .align 3
        .globl  tbi
        .ent    tbi
tbi:
        .prologue 0
        call_pal PAL_tbi
        ret     ($26)
        .end tbi

        .align 3
        .globl  halt
        .ent    halt
halt:
        .prologue 0
        call_pal PAL_halt
        .end halt

/* $16 - new stack page */
        .align 3
        .globl  move_stack
        .ent    move_stack
move_stack:
        .prologue 0
        lda     $0, 0x1fff($31)
        and     $0, $30, $1                     /* Stack offset */
        or      $1, $16, $16                    /* New stack pointer */
        mov     $30, $1
        mov     $16, $2
1:      ldq     $3, 0($1)                       /* Move the stack */
        addq    $1, 8, $1
        stq     $3, 0($2)
        and     $0, $1, $4
        addq    $2, 8, $2
        bne     $4, 1b
        mov     $16, $30
        ret     ($26)
        .end move_stack