2005-04-17 06:20:36 +08:00
|
|
|
/*
|
2006-10-04 05:01:26 +08:00
|
|
|
* arch/alpha/kernel/head.S
|
2005-04-17 06:20:36 +08:00
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2009-04-26 10:10:58 +08:00
|
|
|
#include <linux/init.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
#include <asm/system.h>
|
2005-09-10 03:28:48 +08:00
|
|
|
#include <asm/asm-offsets.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-04-26 10:10:58 +08:00
|
|
|
__HEAD
|
2005-04-17 06:20:36 +08:00
|
|
|
.globl swapper_pg_dir
|
|
|
|
.globl _stext
|
|
|
|
swapper_pg_dir=SWAPPER_PGD
|
|
|
|
|
|
|
|
.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
|