⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 head.s

📁 LINUX 2.6.17.4的源码
💻 S
📖 第 1 页 / 共 2 页
字号:
/* *  arch/s390/kernel/head.S * * (C) Copyright IBM Corp. 1999, 2005 * *    Author(s): Hartmut Penner <hp@de.ibm.com> *		 Martin Schwidefsky <schwidefsky@de.ibm.com> *		 Rob van der Heij <rvdhei@iae.nl> *		 Heiko Carstens <heiko.carstens@de.ibm.com> * * There are 5 different IPL methods *  1) load the image directly into ram at address 0 and do an PSW restart *  2) linload will load the image from address 0x10000 to memory 0x10000 *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated) *  3) generate the tape ipl header, store the generated image on a tape *     and ipl from it *     In case of SL tape you need to IPL 5 times to get past VOL1 etc *  4) generate the vm reader ipl header, move the generated image to the *     VM reader (use option NOH!) and do a ipl from reader (VM only) *  5) direct call of start by the SALIPL loader *  We use the cpuid to distinguish between VM and native ipl *  params for kernel are pushed to 0x10400 (see setup.h) * */#include <linux/config.h>#include <asm/setup.h>#include <asm/lowcore.h>#include <asm/asm-offsets.h>#include <asm/thread_info.h>#include <asm/page.h>#ifdef CONFIG_64BIT#define ARCH_OFFSET	4#else#define ARCH_OFFSET	0#endif#ifndef CONFIG_IPL        .org   0        .long  0x00080000,0x80000000+startup   # Just a restart PSW#else#ifdef CONFIG_IPL_TAPE#define IPL_BS 1024        .org   0        .long  0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded        .long  0x27000000,0x60000001           # by ipl to addresses 0-23.        .long  0x02000000,0x20000000+IPL_BS    # (a PSW and two CCWs).        .long  0x00000000,0x00000000           # external old psw        .long  0x00000000,0x00000000           # svc old psw        .long  0x00000000,0x00000000           # program check old psw        .long  0x00000000,0x00000000           # machine check old psw        .long  0x00000000,0x00000000           # io old psw        .long  0x00000000,0x00000000        .long  0x00000000,0x00000000        .long  0x00000000,0x00000000        .long  0x000a0000,0x00000058           # external new psw        .long  0x000a0000,0x00000060           # svc new psw        .long  0x000a0000,0x00000068           # program check new psw        .long  0x000a0000,0x00000070           # machine check new psw        .long  0x00080000,0x80000000+.Lioint   # io new psw        .org   0x100## subroutine for loading from tape# Paramters:	#  R1 = device number#  R2 = load address.Lloader:	        st    %r14,.Lldret        la    %r3,.Lorbread                    # r3 = address of orb 	la    %r5,.Lirb                        # r5 = address of irb        st    %r2,.Lccwread+4                  # initialize CCW data addresses        lctl  %c6,%c6,.Lcr6                       slr   %r2,%r2.Lldlp:        la    %r6,3                            # 3 retries.Lssch:        ssch  0(%r3)                           # load chunk of IPL_BS bytes        bnz   .Llderr.Lw4end:        bas   %r14,.Lwait4io        tm    8(%r5),0x82                      # do we have a problem ?        bnz   .Lrecov        slr   %r7,%r7        icm   %r7,3,10(%r5)                    # get residual count        lcr   %r7,%r7        la    %r7,IPL_BS(%r7)                  # IPL_BS-residual=#bytes read        ar    %r2,%r7                          # add to total size        tm    8(%r5),0x01                      # found a tape mark ?        bnz   .Ldone        l     %r0,.Lccwread+4                  # update CCW data addresses        ar    %r0,%r7        st    %r0,.Lccwread+4                        b     .Lldlp.Ldone:        l     %r14,.Lldret        br    %r14                             # r2 contains the total size.Lrecov:        bas   %r14,.Lsense                     # do the sensing        bct   %r6,.Lssch                       # dec. retry count & branch        b     .Llderr## Sense subroutine#.Lsense:        st    %r14,.Lsnsret        la    %r7,.Lorbsense                      ssch  0(%r7)                           # start sense command        bnz   .Llderr        bas   %r14,.Lwait4io        l     %r14,.Lsnsret        tm    8(%r5),0x82                      # do we have a problem ?        bnz   .Llderr        br    %r14## Wait for interrupt subroutine#.Lwait4io:        lpsw  .Lwaitpsw                 .Lioint:        c     %r1,0xb8                         # compare subchannel number        bne   .Lwait4io        tsch  0(%r5)        slr   %r0,%r0        tm    8(%r5),0x82                      # do we have a problem ?        bnz   .Lwtexit        tm    8(%r5),0x04                      # got device end ?        bz    .Lwait4io.Lwtexit:        br    %r14.Llderr:        lpsw  .Lcrash                      .align 8.Lorbread:	.long  0x00000000,0x0080ff00,.Lccwread        .align 8.Lorbsense:        .long  0x00000000,0x0080ff00,.Lccwsense        .align 8.Lccwread:        .long  0x02200000+IPL_BS,0x00000000.Lccwsense:        .long  0x04200001,0x00000000.Lwaitpsw:	.long  0x020a0000,0x80000000+.Lioint.Lirb:	.long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.Lcr6:  .long  0xff000000        .align 8.Lcrash:.long  0x000a0000,0x00000000.Lldret:.long  0.Lsnsret: .long 0#endif  /* CONFIG_IPL_TAPE */#ifdef CONFIG_IPL_VM#define IPL_BS 0x730        .org   0        .long  0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded        .long  0x02000018,0x60000050           # by ipl to addresses 0-23.        .long  0x02000068,0x60000050           # (a PSW and two CCWs).        .fill  80-24,1,0x40                    # bytes 24-79 are discarded !!        .long  0x020000f0,0x60000050           # The next 160 byte are loaded        .long  0x02000140,0x60000050           # to addresses 0x18-0xb7        .long  0x02000190,0x60000050           # They form the continuation        .long  0x020001e0,0x60000050           # of the CCW program started        .long  0x02000230,0x60000050           # by ipl and load the range        .long  0x02000280,0x60000050           # 0x0f0-0x730 from the image        .long  0x020002d0,0x60000050           # to the range 0x0f0-0x730        .long  0x02000320,0x60000050           # in memory. At the end of        .long  0x02000370,0x60000050           # the channel program the PSW        .long  0x020003c0,0x60000050           # at location 0 is loaded.        .long  0x02000410,0x60000050           # Initial processing starts        .long  0x02000460,0x60000050           # at 0xf0 = iplstart.        .long  0x020004b0,0x60000050        .long  0x02000500,0x60000050        .long  0x02000550,0x60000050        .long  0x020005a0,0x60000050        .long  0x020005f0,0x60000050        .long  0x02000640,0x60000050        .long  0x02000690,0x60000050        .long  0x020006e0,0x20000050        .org   0xf0## subroutine for loading cards from the reader#.Lloader:		la    %r3,.Lorb                        # r2 = address of orb into r2	la    %r5,.Lirb                        # r4 = address of irb        la    %r6,.Lccws                      la    %r7,20.Linit:        st    %r2,4(%r6)                       # initialize CCW data addresses        la    %r2,0x50(%r2)        la    %r6,8(%r6)        bct   7,.Linit        lctl  %c6,%c6,.Lcr6                    # set IO subclass mask	slr   %r2,%r2.Lldlp:        ssch  0(%r3)                           # load chunk of 1600 bytes        bnz   .Llderr.Lwait4irq:        mvc   0x78(8),.Lnewpsw                 # set up IO interrupt psw        lpsw  .Lwaitpsw              .Lioint:        c     %r1,0xb8                         # compare subchannel number	bne   .Lwait4irq	tsch  0(%r5)	slr   %r0,%r0	ic    %r0,8(%r5)                       # get device status	chi   %r0,8                            # channel end ?	be    .Lcont	chi   %r0,12                           # channel end + device end ?	be    .Lcont        l     %r0,4(%r5)        s     %r0,8(%r3)                       # r0/8 = number of ccws executed        mhi   %r0,10                           # *10 = number of bytes in ccws        lh    %r3,10(%r5)                      # get residual count        sr    %r0,%r3                          # #ccws*80-residual=#bytes read	ar    %r2,%r0	        br    %r14                             # r2 contains the total size.Lcont:	ahi   %r2,0x640                        # add 0x640 to total size        la    %r6,.Lccws                     la    %r7,20.Lincr:        l     %r0,4(%r6)                       # update CCW data addresses        ahi   %r0,0x640        st    %r0,4(%r6)        ahi   %r6,8        bct   7,.Lincr        b     .Lldlp.Llderr:        lpsw  .Lcrash                      .align 8.Lorb:	.long  0x00000000,0x0080ff00,.Lccws.Lirb:	.long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.Lcr6:  .long  0xff000000.Lloadp:.long  0,0        .align 8.Lcrash:.long  0x000a0000,0x00000000.Lnewpsw:        .long  0x00080000,0x80000000+.Lioint.Lwaitpsw:        .long  0x020a0000,0x80000000+.Lioint        .align 8.Lccws: .rept  19        .long  0x02600050,0x00000000        .endr        .long  0x02200050,0x00000000#endif  /* CONFIG_IPL_VM */iplstart:        lh    %r1,0xb8                         # test if subchannel number        bct   %r1,.Lnoload                     #  is valid	l     %r1,0xb8                         # load ipl subchannel number        la    %r2,IPL_BS                       # load start address        bas   %r14,.Lloader                    # load rest of ipl image        l     %r12,.Lparm                      # pointer to parameter area        st    %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number## load parameter file from ipl device#

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -