📄 head.s
字号:
brct %r3,.Lidebc j .Lnocv.Ldocv: l %r3,.Lcvtab tr 0(256,%r4),0(%r3) # convert parameters to ascii tr 256(256,%r4),0(%r3) tr 512(256,%r4),0(%r3) tr 768(122,%r4),0(%r3).Lnocv: la %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line mvc 0(256,%r3),0(%r4) mvc 256(256,%r3),256(%r4) mvc 512(256,%r3),512(%r4) mvc 768(122,%r3),768(%r4) slr %r0,%r0 j .Lcntlp.Ldelspc: ic %r0,0(%r2,%r3) chi %r0,0x20 # is it a space ? je .Lcntlp ahi %r2,1 j .Leolp.Lcntlp: brct %r2,.Ldelspc.Leolp: slr %r0,%r0 stc %r0,0(%r2,%r3) # terminate buffer.Lnopf:## load ramdisk from reader# l %r2,INITRD_START-PARMAREA(%r12) # load adr. of ramdisk bras %r14,.Lloader # load ramdisk st %r2,INITRD_SIZE-PARMAREA(%r12) # store size of ramdisk ltr %r2,%r2 jnz .Lrdcont st %r2,INITRD_START-PARMAREA(%r12) # no ramdisk found, null it.Lrdcont:## everything loaded, reset files in reader, then go for it# stidp __LC_CPUID # store cpuid lh %r0,__LC_CPUID+4 # get cpu version chi %r0,0x7490 # running on P/390 ? je start # no -> skip reset la %r2,.Lreset lhi %r3,26 .long 0x83230008 j start## 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 ahi %r2,0x50 ahi %r6,8 brct 7,.Linit lctl %c6,%c6,.Lcr6 # set IO subclass mask slr %r2,%r2.Lldlp: ssch 0(%r3) # load chunk of 1600 bytes jnz .Llderr.Lwait4irq: mvc __LC_IO_NEW_PSW(8),.Lnewpsw # set up IO interrupt psw lpsw .Lwaitpsw .Lioint: c %r1,0xb8 # compare subchannel number jne .Lwait4irq tsch 0(%r5) slr %r0,%r0 ic %r0,8(%r5) # get device status chi %r0,8 # channel end ? je .Lcont chi %r0,12 # channel end + device end ? je .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 brct 7,.Lincr j .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.Lparm: .long PARMAREA.L4malign0:.long 0xffc00000.Lbigmem:.long 0x04000000.Lrdstart:.long 0x02000000.Lcvtab:.long _ebcasc # ebcdic to ascii table.Lreset:.byte 0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40 .byte 0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6 .byte 0xc8,0xd6,0xd3,0xc4 # "change rdr all keep nohold" .align 8.Lpcmem0:.long 0x00080000,0x80000000 + .Lchkmem0.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 .org 0x730 # end of the area loaded by the ipl channel program#endif /* CONFIG_IPL_VM */#endif /* CONFIG_IPL */## startup-code at 0x10000, running in real mode# this is called either by the ipl loader or directly by PSW restart or linload# .org 0x10000 .globl startstart: basr %r13,0 # get base.LPG1: lctl %c1,%c1,.Lpstd-.LPG1(%r13) # load pstd lctl %c7,%c7,.Lpstd-.LPG1(%r13) # load sstd lctl %c13,%c13,.Lpstd-.LPG1(%r13) # load hstd lctl %c0,%c0,.Lcr0-.LPG1(%r13) # set CR0 l %r12,.Lparm1-.LPG1(%r13) # pointer to parameter area## find out memory size. That is done in the ipl loader too but for# ipl from dasd the size of the memory has to be detected too...# icm %r0,15,MEMORY_SIZE-PARMAREA(%r12) jnz .Lsizeok mvc 104(8,0),.Lpcmem-.LPG1(%r13) # setup program check handler slr %r1,%r1 lhi %r2,1 sll %r2,20.Lloop: l %r0,0(%r1) # test page ar %r1,%r2 # add 1M jnm .Lloop # r1 < 0x80000000 -> loop.Lchkmem: n %r1,.L4malign-.LPG1(%r13) # align to multiples of 4M st %r1,MEMORY_SIZE-PARMAREA(%r12) # store memory size.Lsizeok:## find out if we are running under VM# stidp __LC_CPUID # store cpuid tm __LC_CPUID,0xff # running under VM ? jno .Lnovm oi MACHINE_FLAGS+3-PARMAREA(%r12),1 # set VM flag.Lnovm: lh %r0,__LC_CPUID+4 # get cpu version chi %r0,0x7490 # running on a P/390 ? jne .Lnop390 oi MACHINE_FLAGS+3-PARMAREA(%r12),4 # set P/390 flag.Lnop390:## find out if we have an IEEE fpu# mvc 104(8,0),.Lpcfpu-.LPG1(%r13) # setup program check handler ld %f0,.Lflt0-.LPG1(%r13) # load (float) 0.0 ldr %f2,%f0 adbr %f0,%f2 # test IEEE add instruction oi MACHINE_FLAGS+3-PARMAREA(%r12),2 # set IEEE fpu flag.Lchkfpu: lpsw .Lentry-.LPG1(13) # jump to _stext in primary-space, # virtual and never return ... .align 8.Lentry:.long 0x04080000,0x80000000 + _stext.Lpstd: .long .Lpgd+0x7F # segment-table.Lcr0: .long 0x04b50002.Lpcmem:.long 0x00080000,0x80000000 + .Lchkmem.Lpcfpu:.long 0x00080000,0x80000000 + .Lchkfpu.Lflt0: .double 0.Lparm1:.long PARMAREA.L4malign:.long 0xffc00000## params at 10400 (setup.h)# .org PARMAREA .long 0x0100 # ORIG_ROOT_DEV: ramdisk major/minor .word 0 # MOUNT_ROOT_RDONLY: no .long 0 # MEMORY_SIZE .long 0 # MACHINE_FLAGS (bit 0:VM, bit 1:IEEE) .long RAMDISK_ORIGIN # INITRD_START .long 0x800000 # INITRD_SIZE .word 0 # RAMDISK_FLAGS .org COMMAND_LINE# .byte "root=/dev/nfs rw nfsroot=9.164.160.7:/home/mschwide/nfsboot "# .byte "ip=9.164.147.12:9.164.160.7:9.164.147.1:255.255.255.0:vmlinux:tr0:off"# .byte "root=/dev/nfs nfsroot=9.164.160.7:/home/mschwide/nfsboot "# .byte "ip=9.164.181.228:9.164.160.7:9.164.181.1:255.255.224.0:vmlinux:tr0:off"# .byte "root=/dev/nfs nfsroot=9.164.160.7:/home/pasch/nfsboot "# .byte "ip=9.164.185.120:9.164.160.7:9.164.181.1:255.255.224.0:vmlinux:tr0:off"# .byte "mdisk=402:65536:1229,403:131072:2780 root=/dev/mnda ro"# .byte "root=/dev/nfs rw nfsroot=9.164.160.209:/usr/local/nfsboot "# .byte "ip=9.164.181.228:9.164.160.209:9.164.181.1:255.255.224.0:vmlinux:tr0:off" .byte "root=/dev/ram0 ro"# .byte 0## startup-code, running in virtual mode# .org 0x10800 .globl _stext_stext: basr %r13,0 # get base.LPG2:## Setup lowcore# l %r1,__LC_IPLDEV # load ipl device number spx .Lprefix-.LPG2(%r13) # set prefix to linux lowcore st %r1,__LC_IPLDEV # store ipl device number l %r15,.Linittu-.LPG2(%r13) ahi %r15,8192 # init_task_union + 8191 st %r15,__LC_KERNEL_STACK # set end of kernel stack ahi %r15,-96 xc 0(4,%r15),0(%r15) # set backchain to zero lhi %r0,-1 st %r0,__LC_KERNEL_LEVEL # set interrupt count to -1## clear bss memory# l %r2,.Lbss_bgn-.LPG2(%r13) # start of bss l %r3,.Lbss_end-.LPG2(%r13) # end of bss sr %r3,%r2 # length of bss sr %r4,%r4 # sr %r5,%r5 # set src,length and pad to zero sr %r0,%r0 # mvcle %r2,%r4,0 # clear mem jo .-4 # branch back, if not finish# check control registers stctl %c0,%c15,0(%r15) oc 2(1,%r15),.Locbits+5-.LPG2(%r13) # enable sigp external ints. oc 0(1,%r15),.Locbits+4-.LPG2(%r13) # low addresss proctection lctl %c0,%c15,0(%r15)# lam 0,15,.Laregs-.LPG2(%r13) # load access regs needed by uaccess l %r14,.Lstart-.LPG2(%r13) basr %r14,%r14 # call start_kernel## We returned from start_kernel ?!? PANIK# basr %r13,0 lpsw .Ldw-.(%r13) # load disabled wait psw#.Lstart: .long start_kernel .align 8.Lprefix: .long init_S390_lowcore .Linittu: .long init_task_union.Lbss_bgn: .long __bss_start.Lbss_end: .long _end.Locbits: .long 0x01020408,0x10204080 .align 4.Laregs: .long 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 .align 8.Ldw: .long 0x000a0000,0x00000000## tempory segment-table at 0x11000# .org 0x11000.Lpgd: .long .Lpt0+0x1f # 00000000-000fffff .long .Lpt1+0x1f # 00100000-001fffff .long .Lpt2+0x1f # 00200000-002fffff .long .Lpt3+0x1f # 00300000-003fffff .fill 2044,4,0x20 # 00400000-7fffffff## tempory page-tables at 0x12000-0x15fff# .macro mktable from,to .long \from*0x10000 .long \from*0x10000+0x1000 .long \from*0x10000+0x2000 .long \from*0x10000+0x3000 .long \from*0x10000+0x4000 .long \from*0x10000+0x5000 .long \from*0x10000+0x6000 .long \from*0x10000+0x7000 .long \from*0x10000+0x8000 .long \from*0x10000+0x9000 .long \from*0x10000+0xa000 .long \from*0x10000+0xb000 .long \from*0x10000+0xc000 .long \from*0x10000+0xd000 .long \from*0x10000+0xe000 .long \from*0x10000+0xf000 .if \to-\from mktable "(\from+1)",\to .endif .endm.Lpt0: mktable 0,15.Lpt1: mktable 16,31.Lpt2: mktable 32,47.Lpt3: mktable 48,63
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -