>> 1 /* SPDX-License-Identifier: GPL-2.0 */ 1 /* 2 /* 2 * This file is subject to the terms and condi !! 3 * arch/alpha/kernel/head.S 3 * License. See the file "COPYING" in the mai << 4 * for more details. << 5 * 4 * 6 * Copyright (C) 1994, 1995 Waldorf Electronic !! 5 * initial boot stuff.. At this point, the bootloader has already 7 * Written by Ralf Baechle and Andreas Busse !! 6 * switched into OSF/1 PAL-code, and loaded us at the correct address 8 * Copyright (C) 1994 - 99, 2003, 06 Ralf Baec !! 7 * (START_ADDR). So there isn't much left for us to do: just set up 9 * Copyright (C) 1996 Paul M. Antoine !! 8 * the kernel global pointer and jump to the kernel entry-point. 10 * Modified for DECStation and hence R3000 sup << 11 * Further modifications by David S. Miller an << 12 * Copyright (C) 1999 Silicon Graphics, Inc. << 13 * Kevin Kissell, kevink@mips.com and Carsten << 14 * Copyright (C) 2000 MIPS Technologies, Inc. << 15 */ 9 */ 16 #include <linux/init.h> << 17 #include <linux/threads.h> << 18 10 19 #include <asm/addrspace.h> !! 11 #include <linux/init.h> 20 #include <asm/asm.h> !! 12 #include <asm/asm-offsets.h> 21 #include <asm/asmmacro.h> !! 13 #include <asm/pal.h> 22 #include <asm/irqflags.h> !! 14 #include <asm/setup.h> 23 #include <asm/regdef.h> !! 15 24 #include <asm/mipsregs.h> !! 16 __HEAD 25 #include <asm/stackframe.h> !! 17 .globl _stext 26 !! 18 .set noreorder 27 #include <kernel-entry-init.h> !! 19 .globl __start 28 !! 20 .ent __start 29 /* !! 21 _stext: 30 * For the moment disable interrupts, !! 22 __start: 31 * set ST0_KX so that the CPU does not !! 23 .prologue 0 32 * 64-bit addresses. A full initializ !! 24 br $27,1f 33 * register is done later in per_cpu_t !! 25 1: ldgp $29,0($27) 34 */ !! 26 /* We need to get current_task_info loaded up... */ 35 .macro setup_c0_status set clr !! 27 lda $8,init_thread_union 36 .set push !! 28 /* ... and find our stack ... */ 37 mfc0 t0, CP0_STATUS !! 29 lda $30,0x4000 - SIZEOF_PT_REGS($8) 38 or t0, ST0_KERNEL_CUMASK|\set|0x1 !! 30 /* ... and then we can start the kernel. */ 39 xor t0, 0x1f|\clr !! 31 jsr $26,start_kernel 40 mtc0 t0, CP0_STATUS !! 32 call_pal PAL_halt 41 .set noreorder !! 33 .end __start 42 sll zero,3 << 43 .set pop << 44 .endm << 45 << 46 .macro setup_c0_status_pri << 47 #ifdef CONFIG_64BIT << 48 setup_c0_status ST0_KX 0 << 49 #else << 50 setup_c0_status 0 0 << 51 #endif << 52 .endm << 53 << 54 .macro setup_c0_status_sec << 55 #ifdef CONFIG_64BIT << 56 setup_c0_status ST0_KX ST0_BEV << 57 #else << 58 setup_c0_status 0 ST0_BEV << 59 #endif << 60 .endm << 61 << 62 #ifndef CONFIG_NO_EXCEPT_FILL << 63 /* << 64 * Reserved space for exception handle << 65 * Necessary for machines which link t << 66 */ << 67 .fill 0x400 << 68 #endif << 69 << 70 EXPORT(_stext) << 71 << 72 #ifdef CONFIG_BOOT_RAW << 73 /* << 74 * Give us a fighting chance of runnin << 75 * kernel load address. This is neede << 76 * not have a ELF loader yet. << 77 */ << 78 FEXPORT(__kernel_entry) << 79 j kernel_entry << 80 #endif /* CONFIG_BOOT_RAW */ << 81 << 82 __REF << 83 << 84 NESTED(kernel_entry, 16, sp) << 85 << 86 kernel_entry_setup << 87 << 88 setup_c0_status_pri << 89 << 90 /* We might not get launched at the ad << 91 so we jump there. */ << 92 PTR_LA t0, 0f << 93 jr t0 << 94 0: << 95 << 96 PTR_LA t0, __bss_start << 97 LONG_S zero, (t0) << 98 PTR_LA t1, __bss_stop - LONGS << 99 1: << 100 PTR_ADDIU t0, LONGSIZE << 101 LONG_S zero, (t0) << 102 bne t0, t1, 1b << 103 << 104 LONG_S a0, fw_arg0 << 105 LONG_S a1, fw_arg1 << 106 LONG_S a2, fw_arg2 << 107 LONG_S a3, fw_arg3 << 108 << 109 MTC0 zero, CP0_CONTEXT << 110 #ifdef CONFIG_64BIT << 111 MTC0 zero, CP0_XCONTEXT << 112 #endif << 113 PTR_LA $28, init_thread_union << 114 /* Set the SP after an empty pt_regs. << 115 PTR_LI sp, _THREAD_SIZE - 32 << 116 PTR_ADDU sp, $28 << 117 back_to_back_c0_hazard << 118 set_saved_sp sp, t0, t1 << 119 PTR_SUBU sp, 4 * SZREG << 120 << 121 #ifdef CONFIG_RELOCATABLE << 122 /* Copy kernel and apply the relocatio << 123 jal relocate_kernel << 124 << 125 /* Repoint the sp into the new kernel << 126 PTR_LI sp, _THREAD_SIZE - 32 << 127 PTR_ADDU sp, $28 << 128 set_saved_sp sp, t0, t1 << 129 PTR_SUBU sp, 4 * SZREG << 130 << 131 /* << 132 * relocate_kernel returns the entry p << 133 * in the relocated kernel or the orig << 134 * some reason relocation failed - jum << 135 * with instruction hazard barrier bec << 136 * newly sync'd icache. << 137 */ << 138 jr.hb v0 << 139 #else /* !CONFIG_RELOCATABLE */ << 140 j start_kernel << 141 #endif /* !CONFIG_RELOCATABLE */ << 142 END(kernel_entry) << 143 34 144 #ifdef CONFIG_SMP 35 #ifdef CONFIG_SMP 145 /* !! 36 .align 3 146 * SMP slave cpus entry point. Board specific !! 37 .globl __smp_callin 147 * function after setting up the stack and gp !! 38 .ent __smp_callin 148 */ !! 39 /* On entry here from SRM console, the HWPCB of the per-cpu 149 NESTED(smp_bootstrap, 16, sp) !! 40 slot for this processor has been loaded. We've arranged 150 smp_slave_setup !! 41 for the UNIQUE value for this process to contain the PCBB 151 setup_c0_status_sec !! 42 of the target idle task. */ 152 j start_secondary !! 43 __smp_callin: 153 END(smp_bootstrap) !! 44 .prologue 1 >> 45 ldgp $29,0($27) # First order of business, load the GP. >> 46 >> 47 call_pal PAL_rduniq # Grab the target PCBB. >> 48 mov $0,$16 # Install it. >> 49 call_pal PAL_swpctx >> 50 >> 51 lda $8,0x3fff # Find "current". >> 52 bic $30,$8,$8 >> 53 >> 54 jsr $26,smp_callin >> 55 call_pal PAL_halt >> 56 .end __smp_callin 154 #endif /* CONFIG_SMP */ 57 #endif /* CONFIG_SMP */ >> 58 >> 59 # >> 60 # The following two functions are needed for supporting SRM PALcode >> 61 # on the PC164 (at least), since that PALcode manages the interrupt >> 62 # masking, and we cannot duplicate the effort without causing problems >> 63 # >> 64 >> 65 .align 3 >> 66 .globl cserve_ena >> 67 .ent cserve_ena >> 68 cserve_ena: >> 69 .prologue 0 >> 70 bis $16,$16,$17 >> 71 lda $16,52($31) >> 72 call_pal PAL_cserve >> 73 ret ($26) >> 74 .end cserve_ena >> 75 >> 76 .align 3 >> 77 .globl cserve_dis >> 78 .ent cserve_dis >> 79 cserve_dis: >> 80 .prologue 0 >> 81 bis $16,$16,$17 >> 82 lda $16,53($31) >> 83 call_pal PAL_cserve >> 84 ret ($26) >> 85 .end cserve_dis >> 86 >> 87 # >> 88 # It is handy, on occasion, to make halt actually just loop. >> 89 # Putting it here means we dont have to recompile the whole >> 90 # kernel. >> 91 # >> 92 >> 93 .align 3 >> 94 .globl halt >> 95 .ent halt >> 96 halt: >> 97 .prologue 0 >> 98 call_pal PAL_halt >> 99 .end halt
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.