linux/arch/alpha/kernel/head.S
<<
>>
Prefs
   1/*
   2 * arch/alpha/kernel/head.S
   3 *
   4 * initial boot stuff.. At this point, the bootloader has already
   5 * switched into OSF/1 PAL-code, and loaded us at the correct address
   6 * (START_ADDR).  So there isn't much left for us to do: just set up
   7 * the kernel global pointer and jump to the kernel entry-point.
   8 */
   9
  10#include <linux/init.h>
  11#include <asm/system.h>
  12#include <asm/asm-offsets.h>
  13
  14__HEAD
  15.globl swapper_pg_dir
  16.globl _stext
  17swapper_pg_dir=SWAPPER_PGD
  18
  19        .set noreorder
  20        .globl  __start
  21        .ent    __start
  22_stext:
  23__start:
  24        .prologue 0
  25        br      $27,1f
  261:      ldgp    $29,0($27)
  27        /* We need to get current_task_info loaded up...  */
  28        lda     $8,init_thread_union
  29        /* ... and find our stack ... */
  30        lda     $30,0x4000 - SIZEOF_PT_REGS($8)
  31        /* ... and then we can start the kernel.  */
  32        jsr     $26,start_kernel
  33        call_pal PAL_halt
  34        .end __start
  35
  36#ifdef CONFIG_SMP
  37        .align 3
  38        .globl  __smp_callin
  39        .ent    __smp_callin
  40        /* On entry here from SRM console, the HWPCB of the per-cpu
  41           slot for this processor has been loaded.  We've arranged
  42           for the UNIQUE value for this process to contain the PCBB
  43           of the target idle task.  */
  44__smp_callin:
  45        .prologue 1
  46        ldgp    $29,0($27)      # First order of business, load the GP.
  47
  48        call_pal PAL_rduniq     # Grab the target PCBB.
  49        mov     $0,$16          # Install it.
  50        call_pal PAL_swpctx
  51
  52        lda     $8,0x3fff       # Find "current".
  53        bic     $30,$8,$8
  54        
  55        jsr     $26,smp_callin
  56        call_pal PAL_halt
  57        .end __smp_callin
  58#endif /* CONFIG_SMP */
  59
  60        #
  61        # The following two functions are needed for supporting SRM PALcode
  62        # on the PC164 (at least), since that PALcode manages the interrupt
  63        # masking, and we cannot duplicate the effort without causing problems
  64        #
  65
  66        .align 3
  67        .globl  cserve_ena
  68        .ent    cserve_ena
  69cserve_ena:
  70        .prologue 0
  71        bis     $16,$16,$17
  72        lda     $16,52($31)
  73        call_pal PAL_cserve
  74        ret     ($26)
  75        .end    cserve_ena
  76
  77        .align 3
  78        .globl  cserve_dis
  79        .ent    cserve_dis
  80cserve_dis:
  81        .prologue 0
  82        bis     $16,$16,$17
  83        lda     $16,53($31)
  84        call_pal PAL_cserve
  85        ret     ($26)
  86        .end    cserve_dis
  87
  88        #
  89        # It is handy, on occasion, to make halt actually just loop. 
  90        # Putting it here means we dont have to recompile the whole
  91        # kernel.
  92        #
  93
  94        .align 3
  95        .globl  halt
  96        .ent    halt
  97halt:
  98        .prologue 0
  99        call_pal PAL_halt
 100        .end    halt
 101