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