📄 head.s
字号:
/* * Here is where the ball gets rolling as far as the kernel is concerned. * When control is transferred to _start, the bootload has already * loaded us to the correct address. All that's left to do here is * to set up the kernel's global pointer and jump to the kernel * entry point. * * Copyright (C) 1998-2001 Hewlett-Packard Co * David Mosberger-Tang <davidm@hpl.hp.com> * Stephane Eranian <eranian@hpl.hp.com> * Copyright (C) 1999 VA Linux Systems * Copyright (C) 1999 Walt Drummond <drummond@valinux.com> * Copyright (C) 1999 Intel Corp. * Copyright (C) 1999 Asit Mallick <Asit.K.Mallick@intel.com> * Copyright (C) 1999 Don Dugger <Don.Dugger@intel.com> * Copyright (C) 2002 Fenghua Yu <fenghua.yu@intel.com> * -Optimize __ia64_save_fpu() and __ia64_load_fpu() for Itanium 2. */#include <linux/config.h>#include <asm/asmmacro.h>#include <asm/fpu.h>#include <asm/kregs.h>#include <asm/mmu_context.h>#include <asm/offsets.h>#include <asm/pal.h>#include <asm/pgtable.h>#include <asm/processor.h>#include <asm/ptrace.h>#include <asm/system.h> .section __special_page_section,"ax" .global empty_zero_pageempty_zero_page: .skip PAGE_SIZE .global swapper_pg_dirswapper_pg_dir: .skip PAGE_SIZE .rodatahalt_msg: stringz "Halting kernel\n" .text .global start_ap /* * Start the kernel. When the bootloader passes control to _start(), r28 * points to the address of the boot parameter area. Execution reaches * here in physical mode. */GLOBAL_ENTRY(_start)start_ap: .prologue .save rp, r4 // terminate unwind chain with a NULL rp mov r4=r0 .body /* * Initialize the region register for region 7 and install a translation register * that maps the kernel's text and data: */ rsm psr.i | psr.ic mov r16=((ia64_rid(IA64_REGION_ID_KERNEL, PAGE_OFFSET) << 8) | (IA64_GRANULE_SHIFT << 2)) ;; srlz.i mov r18=KERNEL_TR_PAGE_SHIFT<<2 movl r17=KERNEL_START ;; mov rr[r17]=r16 mov cr.itir=r18 mov cr.ifa=r17 mov r16=IA64_TR_KERNEL movl r18=((1 << KERNEL_TR_PAGE_SHIFT) | PAGE_KERNEL) ;; srlz.i ;; itr.i itr[r16]=r18 ;; itr.d dtr[r16]=r18 ;; srlz.i /* * Switch into virtual mode: */ movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ |IA64_PSR_DI) ;; mov cr.ipsr=r16 movl r17=1f ;; mov cr.iip=r17 mov cr.ifs=r0 ;; rfi ;;1: // now we are in virtual mode // set IVT entry point---can't access I/O ports without it movl r3=ia64_ivt ;; mov cr.iva=r3 movl r2=FPSR_DEFAULT ;; srlz.i movl gp=__gp mov ar.fpsr=r2 ;;#ifdef CONFIG_IA64_EARLY_PRINTK mov r3=(6<<8) | (IA64_GRANULE_SHIFT<<2) movl r2=6<<61 ;; mov rr[r2]=r3 ;; srlz.i ;;#endif#define isAP p2 // are we an Application Processor?#define isBP p3 // are we the Bootstrap Processor?#ifdef CONFIG_SMP /* * Find the init_task for the currently booting CPU. At poweron, and in * UP mode, cpucount is 0. */ movl r3=cpucount ;; ld4 r3=[r3] // r3 <- smp_processor_id() movl r2=init_tasks ;; shladd r2=r3,3,r2 ;; ld8 r2=[r2]#else mov r3=0 movl r2=init_task_union ;;#endif cmp4.ne isAP,isBP=r3,r0 ;; // RAW on r2 extr r3=r2,0,61 // r3 == phys addr of task struct mov r16=KERNEL_TR_PAGE_NUM ;; // load the "current" pointer (r13) and ar.k6 with the current task mov r13=r2 mov IA64_KR(CURRENT)=r3 // Physical address // initialize k4 to a safe value (64-128MB is mapped by TR_KERNEL) mov IA64_KR(CURRENT_STACK)=r16 /* * Reserve space at the top of the stack for "struct pt_regs". Kernel threads * don't store interesting values in that structure, but the space still needs * to be there because time-critical stuff such as the context switching can * be implemented more efficiently (for example, __switch_to() * always sets the psr.dfh bit of the task it is switching to). */ addl r12=IA64_STK_OFFSET-IA64_PT_REGS_SIZE-16,r2 addl r2=IA64_RBS_OFFSET,r2 // initialize the RSE mov ar.rsc=0 // place RSE in enforced lazy mode ;; loadrs // clear the dirty partition ;; mov ar.bspstore=r2 // establish the new RSE stack ;; mov ar.rsc=0x3 // place RSE in eager mode(isBP) dep r28=-1,r28,61,3 // make address virtual(isBP) movl r2=ia64_boot_param ;;(isBP) st8 [r2]=r28 // save the address of the boot param area passed by the bootloader#ifdef CONFIG_IA64_EARLY_PRINTK .rodataalive_msg: stringz "I'm alive and well\n"alive_msg_end: .previous alloc r2=ar.pfs,0,0,2,0 movl out0=alive_msg movl out1=alive_msg_end-alive_msg-1 ;; br.call.sptk.many rp=early_printk1: // force new bundle#endif /* CONFIG_IA64_EARLY_PRINTK */#ifdef CONFIG_SMP(isAP) br.call.sptk.many rp=start_secondary.ret0:(isAP) br.cond.sptk self#endif // This is executed by the bootstrap processor (bsp) only:#ifdef CONFIG_IA64_FW_EMU // initialize PAL & SAL emulator: br.call.sptk.many rp=sys_fw_init.ret1:#endif br.call.sptk.many rp=start_kernel.ret2: addl r3=@ltoff(halt_msg),gp ;; alloc r2=ar.pfs,8,0,2,0 ;; ld8 out0=[r3] br.call.sptk.many b0=console_printself: br.sptk.many self // endless loopEND(_start)GLOBAL_ENTRY(ia64_save_debug_regs) alloc r16=ar.pfs,1,0,0,0 mov r20=ar.lc // preserve ar.lc mov ar.lc=IA64_NUM_DBG_REGS-1 mov r18=0 add r19=IA64_NUM_DBG_REGS*8,in0 ;;1: mov r16=dbr[r18]#ifdef CONFIG_ITANIUM ;; srlz.d#endif mov r17=ibr[r18] add r18=1,r18 ;; st8.nta [in0]=r16,8 st8.nta [r19]=r17,8 br.cloop.sptk.many 1b ;; mov ar.lc=r20 // restore ar.lc br.ret.sptk.many rpEND(ia64_save_debug_regs)GLOBAL_ENTRY(ia64_load_debug_regs) alloc r16=ar.pfs,1,0,0,0 lfetch.nta [in0] mov r20=ar.lc // preserve ar.lc add r19=IA64_NUM_DBG_REGS*8,in0 mov ar.lc=IA64_NUM_DBG_REGS-1 mov r18=-1 ;;1: ld8.nta r16=[in0],8 ld8.nta r17=[r19],8 add r18=1,r18 ;; mov dbr[r18]=r16#ifdef CONFIG_ITANIUM ;; srlz.d // Errata 132 (NoFix status)#endif mov ibr[r18]=r17 br.cloop.sptk.many 1b ;; mov ar.lc=r20 // restore ar.lc br.ret.sptk.many rpEND(ia64_load_debug_regs)GLOBAL_ENTRY(__ia64_save_fpu) alloc r2=ar.pfs,1,4,0,0 adds loc0=96*16-16,in0 adds loc1=96*16-16-128,in0 ;; stf.spill.nta [loc0]=f127,-256 stf.spill.nta [loc1]=f119,-256 ;; stf.spill.nta [loc0]=f111,-256 stf.spill.nta [loc1]=f103,-256 ;; stf.spill.nta [loc0]=f95,-256 stf.spill.nta [loc1]=f87,-256 ;; stf.spill.nta [loc0]=f79,-256 stf.spill.nta [loc1]=f71,-256 ;; stf.spill.nta [loc0]=f63,-256 stf.spill.nta [loc1]=f55,-256 adds loc2=96*16-32,in0 ;; stf.spill.nta [loc0]=f47,-256 stf.spill.nta [loc1]=f39,-256 adds loc3=96*16-32-128,in0 ;; stf.spill.nta [loc2]=f126,-256 stf.spill.nta [loc3]=f118,-256 ;; stf.spill.nta [loc2]=f110,-256 stf.spill.nta [loc3]=f102,-256 ;; stf.spill.nta [loc2]=f94,-256 stf.spill.nta [loc3]=f86,-256 ;; stf.spill.nta [loc2]=f78,-256 stf.spill.nta [loc3]=f70,-256 ;; stf.spill.nta [loc2]=f62,-256 stf.spill.nta [loc3]=f54,-256 adds loc0=96*16-48,in0 ;; stf.spill.nta [loc2]=f46,-256 stf.spill.nta [loc3]=f38,-256 adds loc1=96*16-48-128,in0 ;; stf.spill.nta [loc0]=f125,-256 stf.spill.nta [loc1]=f117,-256 ;; stf.spill.nta [loc0]=f109,-256 stf.spill.nta [loc1]=f101,-256 ;; stf.spill.nta [loc0]=f93,-256 stf.spill.nta [loc1]=f85,-256 ;; stf.spill.nta [loc0]=f77,-256 stf.spill.nta [loc1]=f69,-256 ;; stf.spill.nta [loc0]=f61,-256 stf.spill.nta [loc1]=f53,-256 adds loc2=96*16-64,in0 ;; stf.spill.nta [loc0]=f45,-256 stf.spill.nta [loc1]=f37,-256 adds loc3=96*16-64-128,in0 ;; stf.spill.nta [loc2]=f124,-256 stf.spill.nta [loc3]=f116,-256 ;; stf.spill.nta [loc2]=f108,-256 stf.spill.nta [loc3]=f100,-256 ;; stf.spill.nta [loc2]=f92,-256 stf.spill.nta [loc3]=f84,-256 ;; stf.spill.nta [loc2]=f76,-256 stf.spill.nta [loc3]=f68,-256 ;; stf.spill.nta [loc2]=f60,-256 stf.spill.nta [loc3]=f52,-256 adds loc0=96*16-80,in0 ;; stf.spill.nta [loc2]=f44,-256 stf.spill.nta [loc3]=f36,-256 adds loc1=96*16-80-128,in0 ;; stf.spill.nta [loc0]=f123,-256 stf.spill.nta [loc1]=f115,-256 ;; stf.spill.nta [loc0]=f107,-256 stf.spill.nta [loc1]=f99,-256 ;; stf.spill.nta [loc0]=f91,-256 stf.spill.nta [loc1]=f83,-256 ;; stf.spill.nta [loc0]=f75,-256 stf.spill.nta [loc1]=f67,-256 ;; stf.spill.nta [loc0]=f59,-256 stf.spill.nta [loc1]=f51,-256 adds loc2=96*16-96,in0 ;; stf.spill.nta [loc0]=f43,-256 stf.spill.nta [loc1]=f35,-256 adds loc3=96*16-96-128,in0 ;; stf.spill.nta [loc2]=f122,-256 stf.spill.nta [loc3]=f114,-256 ;; stf.spill.nta [loc2]=f106,-256 stf.spill.nta [loc3]=f98,-256 ;; stf.spill.nta [loc2]=f90,-256 stf.spill.nta [loc3]=f82,-256 ;; stf.spill.nta [loc2]=f74,-256 stf.spill.nta [loc3]=f66,-256 ;; stf.spill.nta [loc2]=f58,-256 stf.spill.nta [loc3]=f50,-256 adds loc0=96*16-112,in0 ;; stf.spill.nta [loc2]=f42,-256 stf.spill.nta [loc3]=f34,-256 adds loc1=96*16-112-128,in0 ;; stf.spill.nta [loc0]=f121,-256 stf.spill.nta [loc1]=f113,-256 ;; stf.spill.nta [loc0]=f105,-256 stf.spill.nta [loc1]=f97,-256 ;; stf.spill.nta [loc0]=f89,-256 stf.spill.nta [loc1]=f81,-256 ;; stf.spill.nta [loc0]=f73,-256 stf.spill.nta [loc1]=f65,-256 ;; stf.spill.nta [loc0]=f57,-256 stf.spill.nta [loc1]=f49,-256 adds loc2=96*16-128,in0 ;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -