| /* SPDX-License-Identifier: GPL-2.0 */ | |
| /* | |
| * arch/alpha/kernel/head.S | |
| * | |
| * initial boot stuff.. At this point, the bootloader has already | |
| * switched into OSF/1 PAL-code, and loaded us at the correct address | |
| * (START_ADDR). So there isn't much left for us to do: just set up | |
| * the kernel global pointer and jump to the kernel entry-point. | |
| */ | |
| #include <linux/init.h> | |
| #include <asm/asm-offsets.h> | |
| #include <asm/pal.h> | |
| #include <asm/setup.h> | |
| __HEAD | |
| .globl _stext | |
| .set noreorder | |
| .globl __start | |
| .ent __start | |
| _stext: | |
| __start: | |
| .prologue 0 | |
| br $27,1f | |
| 1: ldgp $29,0($27) | |
| /* We need to get current_task_info loaded up... */ | |
| lda $8,init_thread_union | |
| /* ... and find our stack ... */ | |
| lda $30,0x4000 - SIZEOF_PT_REGS($8) | |
| /* ... and then we can start the kernel. */ | |
| jsr $26,start_kernel | |
| call_pal PAL_halt | |
| .end __start | |
| #ifdef CONFIG_SMP | |
| .align 3 | |
| .globl __smp_callin | |
| .ent __smp_callin | |
| /* On entry here from SRM console, the HWPCB of the per-cpu | |
| slot for this processor has been loaded. We've arranged | |
| for the UNIQUE value for this process to contain the PCBB | |
| of the target idle task. */ | |
| __smp_callin: | |
| .prologue 1 | |
| ldgp $29,0($27) # First order of business, load the GP. | |
| call_pal PAL_rduniq # Grab the target PCBB. | |
| mov $0,$16 # Install it. | |
| call_pal PAL_swpctx | |
| lda $8,0x3fff # Find "current". | |
| bic $30,$8,$8 | |
| jsr $26,smp_callin | |
| call_pal PAL_halt | |
| .end __smp_callin | |
| #endif /* CONFIG_SMP */ | |
| # | |
| # The following two functions are needed for supporting SRM PALcode | |
| # on the PC164 (at least), since that PALcode manages the interrupt | |
| # masking, and we cannot duplicate the effort without causing problems | |
| # | |
| .align 3 | |
| .globl cserve_ena | |
| .ent cserve_ena | |
| cserve_ena: | |
| .prologue 0 | |
| bis $16,$16,$17 | |
| lda $16,52($31) | |
| call_pal PAL_cserve | |
| ret ($26) | |
| .end cserve_ena | |
| .align 3 | |
| .globl cserve_dis | |
| .ent cserve_dis | |
| cserve_dis: | |
| .prologue 0 | |
| bis $16,$16,$17 | |
| lda $16,53($31) | |
| call_pal PAL_cserve | |
| ret ($26) | |
| .end cserve_dis | |
| # | |
| # It is handy, on occasion, to make halt actually just loop. | |
| # Putting it here means we dont have to recompile the whole | |
| # kernel. | |
| # | |
| .align 3 | |
| .globl halt | |
| .ent halt | |
| halt: | |
| .prologue 0 | |
| call_pal PAL_halt | |
| .end halt |