···44 *55 * Copyright (C) IBM Corp. 1999,200666 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),77- * Hartmut Penner (hp@de.ibm.com),88- * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),77+ * Hartmut Penner (hp@de.ibm.com),88+ * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),99 * Heiko Carstens <heiko.carstens@de.ibm.com>1010 */1111···2424 * Stack layout for the system_call stack entry.2525 * The first few entries are identical to the user_regs_struct.2626 */2727-SP_PTREGS = STACK_FRAME_OVERHEAD2828-SP_ARGS = STACK_FRAME_OVERHEAD + __PT_ARGS2929-SP_PSW = STACK_FRAME_OVERHEAD + __PT_PSW3030-SP_R0 = STACK_FRAME_OVERHEAD + __PT_GPRS3131-SP_R1 = STACK_FRAME_OVERHEAD + __PT_GPRS + 43232-SP_R2 = STACK_FRAME_OVERHEAD + __PT_GPRS + 83333-SP_R3 = STACK_FRAME_OVERHEAD + __PT_GPRS + 123434-SP_R4 = STACK_FRAME_OVERHEAD + __PT_GPRS + 163535-SP_R5 = STACK_FRAME_OVERHEAD + __PT_GPRS + 203636-SP_R6 = STACK_FRAME_OVERHEAD + __PT_GPRS + 243737-SP_R7 = STACK_FRAME_OVERHEAD + __PT_GPRS + 283838-SP_R8 = STACK_FRAME_OVERHEAD + __PT_GPRS + 323939-SP_R9 = STACK_FRAME_OVERHEAD + __PT_GPRS + 364040-SP_R10 = STACK_FRAME_OVERHEAD + __PT_GPRS + 404141-SP_R11 = STACK_FRAME_OVERHEAD + __PT_GPRS + 444242-SP_R12 = STACK_FRAME_OVERHEAD + __PT_GPRS + 484343-SP_R13 = STACK_FRAME_OVERHEAD + __PT_GPRS + 524444-SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 564545-SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 604646-SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR24747-SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC4848-SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP4949-SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE2727+SP_PTREGS = STACK_FRAME_OVERHEAD2828+SP_ARGS = STACK_FRAME_OVERHEAD + __PT_ARGS2929+SP_PSW = STACK_FRAME_OVERHEAD + __PT_PSW3030+SP_R0 = STACK_FRAME_OVERHEAD + __PT_GPRS3131+SP_R1 = STACK_FRAME_OVERHEAD + __PT_GPRS + 43232+SP_R2 = STACK_FRAME_OVERHEAD + __PT_GPRS + 83333+SP_R3 = STACK_FRAME_OVERHEAD + __PT_GPRS + 123434+SP_R4 = STACK_FRAME_OVERHEAD + __PT_GPRS + 163535+SP_R5 = STACK_FRAME_OVERHEAD + __PT_GPRS + 203636+SP_R6 = STACK_FRAME_OVERHEAD + __PT_GPRS + 243737+SP_R7 = STACK_FRAME_OVERHEAD + __PT_GPRS + 283838+SP_R8 = STACK_FRAME_OVERHEAD + __PT_GPRS + 323939+SP_R9 = STACK_FRAME_OVERHEAD + __PT_GPRS + 364040+SP_R10 = STACK_FRAME_OVERHEAD + __PT_GPRS + 404141+SP_R11 = STACK_FRAME_OVERHEAD + __PT_GPRS + 444242+SP_R12 = STACK_FRAME_OVERHEAD + __PT_GPRS + 484343+SP_R13 = STACK_FRAME_OVERHEAD + __PT_GPRS + 524444+SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 564545+SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 604646+SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR24747+SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC4848+SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP4949+SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE50505151_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | _TIF_NEED_RESCHED | \5252 _TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_SINGLE_STEP )···8181 * R15 - kernel stack pointer8282 */83838484- .macro STORE_TIMER lc_offset8484+ .macro STORE_TIMER lc_offset8585#ifdef CONFIG_VIRT_CPU_ACCOUNTING8686 stpt \lc_offset8787#endif8888 .endm89899090#ifdef CONFIG_VIRT_CPU_ACCOUNTING9191- .macro UPDATE_VTIME lc_from,lc_to,lc_sum9191+ .macro UPDATE_VTIME lc_from,lc_to,lc_sum9292 lm %r10,%r11,\lc_from9393 sl %r10,\lc_to9494 sl %r11,\lc_to+4···1471472:148148 .endm149149150150- .macro CREATE_STACK_FRAME psworg,savearea150150+ .macro CREATE_STACK_FRAME psworg,savearea151151 s %r15,BASED(.Lc_spsize) # make room for registers & psw152152 mvc SP_PSW(8,%r15),0(%r12) # move user PSW to stack153153 la %r12,\psworg···160160 st %r12,__SF_BACKCHAIN(%r15) # clear back chain161161 .endm162162163163- .macro RESTORE_ALL psworg,sync163163+ .macro RESTORE_ALL psworg,sync164164 mvc \psworg(8),SP_PSW(%r15) # move user PSW to lowcore165165 .if !\sync166166 ni \psworg+1,0xfd # clear wait state bit···177177 * Returns:178178 * gpr2 = prev179179 */180180- .globl __switch_to180180+ .globl __switch_to181181__switch_to:182182- basr %r1,0182182+ basr %r1,0183183__switch_to_base:184184 tm __THREAD_per(%r3),0xe8 # new process is using per ?185185 bz __switch_to_noper-__switch_to_base(%r1) # if not we're fine186186- stctl %c9,%c11,__SF_EMPTY(%r15) # We are using per stuff187187- clc __THREAD_per(12,%r3),__SF_EMPTY(%r15)188188- be __switch_to_noper-__switch_to_base(%r1) # we got away w/o bashing TLB's189189- lctl %c9,%c11,__THREAD_per(%r3) # Nope we didn't186186+ stctl %c9,%c11,__SF_EMPTY(%r15) # We are using per stuff187187+ clc __THREAD_per(12,%r3),__SF_EMPTY(%r15)188188+ be __switch_to_noper-__switch_to_base(%r1) # we got away w/o bashing TLB's189189+ lctl %c9,%c11,__THREAD_per(%r3) # Nope we didn't190190__switch_to_noper:191191 l %r4,__THREAD_info(%r2) # get thread_info of prev192192 tm __TI_flags+3(%r4),_TIF_MCCK_PENDING # machine check pending?···195195 l %r4,__THREAD_info(%r3) # get thread_info of next196196 oi __TI_flags+3(%r4),_TIF_MCCK_PENDING # set it in next197197__switch_to_no_mcck:198198- stm %r6,%r15,__SF_GPRS(%r15)# store __switch_to registers of prev task198198+ stm %r6,%r15,__SF_GPRS(%r15)# store __switch_to registers of prev task199199 st %r15,__THREAD_ksp(%r2) # store kernel stack to prev->tss.ksp200200 l %r15,__THREAD_ksp(%r3) # load kernel stack from next->tss.ksp201201 lm %r6,%r15,__SF_GPRS(%r15)# load __switch_to registers of next task202202 st %r3,__LC_CURRENT # __LC_CURRENT = current task struct203203 lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4204204- l %r3,__THREAD_info(%r3) # load thread_info from task struct204204+ l %r3,__THREAD_info(%r3) # load thread_info from task struct205205 st %r3,__LC_THREAD_INFO206206 ahi %r3,STACK_SIZE207207 st %r3,__LC_KERNEL_STACK # __LC_KERNEL_STACK = new kernel stack···213213 * are executed with interrupts enabled.214214 */215215216216- .globl system_call216216+ .globl system_call217217system_call:218218 STORE_TIMER __LC_SYNC_ENTER_TIMER219219sysc_saveall:···233233#endif234234sysc_do_svc:235235 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct236236- sla %r7,2 # *4 and test for svc 0237237- bnz BASED(sysc_nr_ok) # svc number > 0236236+ sla %r7,2 # *4 and test for svc 0237237+ bnz BASED(sysc_nr_ok) # svc number > 0238238 # svc 0: system call number in %r1239239 cl %r1,BASED(.Lnr_syscalls)240240 bnl BASED(sysc_nr_ok)241241- lr %r7,%r1 # copy svc number to %r7242242- sla %r7,2 # *4241241+ lr %r7,%r1 # copy svc number to %r7242242+ sla %r7,2 # *4243243sysc_nr_ok:244244 mvc SP_ARGS(4,%r15),SP_R7(%r15)245245sysc_do_restart:246246 l %r8,BASED(.Lsysc_table)247247 tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)248248 l %r8,0(%r7,%r8) # get system call addr.249249- bnz BASED(sysc_tracesys)250250- basr %r14,%r8 # call sys_xxxx251251- st %r2,SP_R2(%r15) # store return value (change R2 on stack)252252- # ATTENTION: check sys_execve_glue before253253- # changing anything here !!249249+ bnz BASED(sysc_tracesys)250250+ basr %r14,%r8 # call sys_xxxx251251+ st %r2,SP_R2(%r15) # store return value (change R2 on stack)252252+ # ATTENTION: check sys_execve_glue before253253+ # changing anything here !!254254255255sysc_return:256256 tm SP_PSW+1(%r15),0x01 # returning to user ?···258258 tm __TI_flags+3(%r9),_TIF_WORK_SVC259259 bnz BASED(sysc_work) # there is work to do (signals etc.)260260sysc_leave:261261- RESTORE_ALL __LC_RETURN_PSW,1261261+ RESTORE_ALL __LC_RETURN_PSW,1262262263263#264264# recheck if there is more work to do265265#266266sysc_work_loop:267267 tm __TI_flags+3(%r9),_TIF_WORK_SVC268268- bz BASED(sysc_leave) # there is no work to do268268+ bz BASED(sysc_leave) # there is no work to do269269#270270# One of the work bits is on. Find out which one.271271#···284284285285#286286# _TIF_NEED_RESCHED is set, call schedule287287-# 288288-sysc_reschedule: 289289- l %r1,BASED(.Lschedule)290290- la %r14,BASED(sysc_work_loop)291291- br %r1 # call scheduler287287+#288288+sysc_reschedule:289289+ l %r1,BASED(.Lschedule)290290+ la %r14,BASED(sysc_work_loop)291291+ br %r1 # call scheduler292292293293#294294# _TIF_MCCK_PENDING is set, call handler···301301#302302# _TIF_SIGPENDING or _TIF_RESTORE_SIGMASK is set, call do_signal303303#304304-sysc_sigpending: 304304+sysc_sigpending:305305 ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP306306- la %r2,SP_PTREGS(%r15) # load pt_regs307307- l %r1,BASED(.Ldo_signal)308308- basr %r14,%r1 # call do_signal306306+ la %r2,SP_PTREGS(%r15) # load pt_regs307307+ l %r1,BASED(.Ldo_signal)308308+ basr %r14,%r1 # call do_signal309309 tm __TI_flags+3(%r9),_TIF_RESTART_SVC310310 bo BASED(sysc_restart)311311 tm __TI_flags+3(%r9),_TIF_SINGLE_STEP···317317#318318sysc_restart:319319 ni __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC320320- l %r7,SP_R2(%r15) # load new svc number320320+ l %r7,SP_R2(%r15) # load new svc number321321 sla %r7,2322322 mvc SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument323323- lm %r2,%r6,SP_R2(%r15) # load svc arguments324324- b BASED(sysc_do_restart) # restart svc323323+ lm %r2,%r6,SP_R2(%r15) # load svc arguments324324+ b BASED(sysc_do_restart) # restart svc325325326326#327327# _TIF_SINGLE_STEP is set, call do_single_step···338338# call trace before and after sys_call339339#340340sysc_tracesys:341341- l %r1,BASED(.Ltrace)342342- la %r2,SP_PTREGS(%r15) # load pt_regs341341+ l %r1,BASED(.Ltrace)342342+ la %r2,SP_PTREGS(%r15) # load pt_regs343343 la %r3,0344344 srl %r7,2345345 st %r7,SP_R2(%r15)···347347 clc SP_R2(4,%r15),BASED(.Lnr_syscalls)348348 bnl BASED(sysc_tracenogo)349349 l %r8,BASED(.Lsysc_table)350350- l %r7,SP_R2(%r15) # strace might have changed the 351351- sll %r7,2 # system call350350+ l %r7,SP_R2(%r15) # strace might have changed the351351+ sll %r7,2 # system call352352 l %r8,0(%r7,%r8)353353sysc_tracego:354354 lm %r3,%r6,SP_R3(%r15)355355 l %r2,SP_ORIG_R2(%r15)356356- basr %r14,%r8 # call sys_xxx357357- st %r2,SP_R2(%r15) # store return value356356+ basr %r14,%r8 # call sys_xxx357357+ st %r2,SP_R2(%r15) # store return value358358sysc_tracenogo:359359 tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)360360- bz BASED(sysc_return)360360+ bz BASED(sysc_return)361361 l %r1,BASED(.Ltrace)362362- la %r2,SP_PTREGS(%r15) # load pt_regs362362+ la %r2,SP_PTREGS(%r15) # load pt_regs363363 la %r3,1364364 la %r14,BASED(sysc_return)365365 br %r1···367367#368368# a new process exits the kernel with ret_from_fork369369#370370- .globl ret_from_fork370370+ .globl ret_from_fork371371ret_from_fork:372372 l %r13,__LC_SVC_NEW_PSW+4373373 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct374374 tm SP_PSW+1(%r15),0x01 # forking a kernel thread ?375375 bo BASED(0f)376376 st %r15,SP_R15(%r15) # store stack pointer for new kthread377377-0: l %r1,BASED(.Lschedtail)378378- basr %r14,%r1377377+0: l %r1,BASED(.Lschedtail)378378+ basr %r14,%r1379379 TRACE_IRQS_ON380380- stosm __SF_EMPTY(%r15),0x03 # reenable interrupts380380+ stosm __SF_EMPTY(%r15),0x03 # reenable interrupts381381 b BASED(sysc_return)382382383383#···386386# but are called with different parameter.387387# return-address is set up above388388#389389-sys_clone_glue: 390390- la %r2,SP_PTREGS(%r15) # load pt_regs391391- l %r1,BASED(.Lclone)392392- br %r1 # branch to sys_clone389389+sys_clone_glue:390390+ la %r2,SP_PTREGS(%r15) # load pt_regs391391+ l %r1,BASED(.Lclone)392392+ br %r1 # branch to sys_clone393393394394-sys_fork_glue: 395395- la %r2,SP_PTREGS(%r15) # load pt_regs396396- l %r1,BASED(.Lfork)397397- br %r1 # branch to sys_fork394394+sys_fork_glue:395395+ la %r2,SP_PTREGS(%r15) # load pt_regs396396+ l %r1,BASED(.Lfork)397397+ br %r1 # branch to sys_fork398398399399-sys_vfork_glue: 400400- la %r2,SP_PTREGS(%r15) # load pt_regs401401- l %r1,BASED(.Lvfork)402402- br %r1 # branch to sys_vfork399399+sys_vfork_glue:400400+ la %r2,SP_PTREGS(%r15) # load pt_regs401401+ l %r1,BASED(.Lvfork)402402+ br %r1 # branch to sys_vfork403403404404-sys_execve_glue: 405405- la %r2,SP_PTREGS(%r15) # load pt_regs406406- l %r1,BASED(.Lexecve)407407- lr %r12,%r14 # save return address408408- basr %r14,%r1 # call sys_execve409409- ltr %r2,%r2 # check if execve failed410410- bnz 0(%r12) # it did fail -> store result in gpr2411411- b 4(%r12) # SKIP ST 2,SP_R2(15) after BASR 14,8412412- # in system_call/sysc_tracesys404404+sys_execve_glue:405405+ la %r2,SP_PTREGS(%r15) # load pt_regs406406+ l %r1,BASED(.Lexecve)407407+ lr %r12,%r14 # save return address408408+ basr %r14,%r1 # call sys_execve409409+ ltr %r2,%r2 # check if execve failed410410+ bnz 0(%r12) # it did fail -> store result in gpr2411411+ b 4(%r12) # SKIP ST 2,SP_R2(15) after BASR 14,8412412+ # in system_call/sysc_tracesys413413414414-sys_sigreturn_glue: 415415- la %r2,SP_PTREGS(%r15) # load pt_regs as parameter416416- l %r1,BASED(.Lsigreturn)417417- br %r1 # branch to sys_sigreturn414414+sys_sigreturn_glue:415415+ la %r2,SP_PTREGS(%r15) # load pt_regs as parameter416416+ l %r1,BASED(.Lsigreturn)417417+ br %r1 # branch to sys_sigreturn418418419419-sys_rt_sigreturn_glue: 420420- la %r2,SP_PTREGS(%r15) # load pt_regs as parameter421421- l %r1,BASED(.Lrt_sigreturn)422422- br %r1 # branch to sys_sigreturn419419+sys_rt_sigreturn_glue:420420+ la %r2,SP_PTREGS(%r15) # load pt_regs as parameter421421+ l %r1,BASED(.Lrt_sigreturn)422422+ br %r1 # branch to sys_sigreturn423423424424sys_sigaltstack_glue:425425- la %r4,SP_PTREGS(%r15) # load pt_regs as parameter426426- l %r1,BASED(.Lsigaltstack)427427- br %r1 # branch to sys_sigreturn428428-425425+ la %r4,SP_PTREGS(%r15) # load pt_regs as parameter426426+ l %r1,BASED(.Lsigaltstack)427427+ br %r1 # branch to sys_sigreturn429428430429/*431430 * Program check handler routine432431 */433432434434- .globl pgm_check_handler433433+ .globl pgm_check_handler435434pgm_check_handler:436435/*437436 * First we need to check for a special case:···447448 */448449 STORE_TIMER __LC_SYNC_ENTER_TIMER449450 SAVE_ALL_BASE __LC_SAVE_AREA450450- tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception451451- bnz BASED(pgm_per) # got per exception -> special case451451+ tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception452452+ bnz BASED(pgm_per) # got per exception -> special case452453 SAVE_ALL_SYNC __LC_PGM_OLD_PSW,__LC_SAVE_AREA453454 CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA454455#ifdef CONFIG_VIRT_CPU_ACCOUNTING···460461pgm_no_vtime:461462#endif462463 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct463463- l %r3,__LC_PGM_ILC # load program interruption code464464+ l %r3,__LC_PGM_ILC # load program interruption code464465 la %r8,0x7f465466 nr %r8,%r3466467pgm_do_call:467467- l %r7,BASED(.Ljump_table)468468- sll %r8,2469469- l %r7,0(%r8,%r7) # load address of handler routine470470- la %r2,SP_PTREGS(%r15) # address of register-save area471471- la %r14,BASED(sysc_return)472472- br %r7 # branch to interrupt-handler468468+ l %r7,BASED(.Ljump_table)469469+ sll %r8,2470470+ l %r7,0(%r8,%r7) # load address of handler routine471471+ la %r2,SP_PTREGS(%r15) # address of register-save area472472+ la %r14,BASED(sysc_return)473473+ br %r7 # branch to interrupt-handler473474474475#475476# handle per exception476477#477478pgm_per:478478- tm __LC_PGM_OLD_PSW,0x40 # test if per event recording is on479479- bnz BASED(pgm_per_std) # ok, normal per event from user space479479+ tm __LC_PGM_OLD_PSW,0x40 # test if per event recording is on480480+ bnz BASED(pgm_per_std) # ok, normal per event from user space480481# ok its one of the special cases, now we need to find out which one481481- clc __LC_PGM_OLD_PSW(8),__LC_SVC_NEW_PSW482482- be BASED(pgm_svcper)482482+ clc __LC_PGM_OLD_PSW(8),__LC_SVC_NEW_PSW483483+ be BASED(pgm_svcper)483484# no interesting special case, ignore PER event484484- lm %r12,%r15,__LC_SAVE_AREA485485- lpsw 0x28485485+ lm %r12,%r15,__LC_SAVE_AREA486486+ lpsw 0x28486487487488#488489# Normal per exception···506507 oi __TI_flags+3(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP507508 tm SP_PSW+1(%r15),0x01 # kernel per event ?508509 bz BASED(kernel_per)509509- l %r3,__LC_PGM_ILC # load program interruption code510510+ l %r3,__LC_PGM_ILC # load program interruption code510511 la %r8,0x7f511511- nr %r8,%r3 # clear per-event-bit and ilc512512- be BASED(sysc_return) # only per or per+check ?512512+ nr %r8,%r3 # clear per-event-bit and ilc513513+ be BASED(sysc_return) # only per or per+check ?513514 b BASED(pgm_do_call)514515515516#···551552 * IO interrupt handler routine552553 */553554554554- .globl io_int_handler555555+ .globl io_int_handler555556io_int_handler:556557 STORE_TIMER __LC_ASYNC_ENTER_TIMER557558 stck __LC_INT_CLOCK···568569#endif569570 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct570571 TRACE_IRQS_OFF571571- l %r1,BASED(.Ldo_IRQ) # load address of do_IRQ572572- la %r2,SP_PTREGS(%r15) # address of register-save area573573- basr %r14,%r1 # branch to standard irq handler572572+ l %r1,BASED(.Ldo_IRQ) # load address of do_IRQ573573+ la %r2,SP_PTREGS(%r15) # address of register-save area574574+ basr %r14,%r1 # branch to standard irq handler574575 TRACE_IRQS_ON575576576577io_return:577577- tm SP_PSW+1(%r15),0x01 # returning to user ?578578+ tm SP_PSW+1(%r15),0x01 # returning to user ?578579#ifdef CONFIG_PREEMPT579579- bno BASED(io_preempt) # no -> check for preemptive scheduling580580+ bno BASED(io_preempt) # no -> check for preemptive scheduling580581#else581581- bno BASED(io_leave) # no-> skip resched & signal582582+ bno BASED(io_leave) # no-> skip resched & signal582583#endif583584 tm __TI_flags+3(%r9),_TIF_WORK_INT584584- bnz BASED(io_work) # there is work to do (signals etc.)585585+ bnz BASED(io_work) # there is work to do (signals etc.)585586io_leave:586586- RESTORE_ALL __LC_RETURN_PSW,0587587+ RESTORE_ALL __LC_RETURN_PSW,0587588io_done:588589589590#ifdef CONFIG_PREEMPT590591io_preempt:591592 icm %r0,15,__TI_precount(%r9)592592- bnz BASED(io_leave)593593+ bnz BASED(io_leave)593594 l %r1,SP_R15(%r15)594595 s %r1,BASED(.Lc_spsize)595596 mvc SP_PTREGS(__PT_SIZE,%r1),SP_PTREGS(%r15)596596- xc __SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1) # clear back chain597597+ xc __SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1) # clear back chain597598 lr %r15,%r1598599io_resume_loop:599600 tm __TI_flags+3(%r9),_TIF_NEED_RESCHED600601 bno BASED(io_leave)601601- mvc __TI_precount(4,%r9),BASED(.Lc_pactive)602602- stosm __SF_EMPTY(%r15),0x03 # reenable interrupts603603- l %r1,BASED(.Lschedule)602602+ mvc __TI_precount(4,%r9),BASED(.Lc_pactive)603603+ stosm __SF_EMPTY(%r15),0x03 # reenable interrupts604604+ l %r1,BASED(.Lschedule)604605 basr %r14,%r1 # call schedule605605- stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts606606- xc __TI_precount(4,%r9),__TI_precount(%r9)606606+ stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts607607+ xc __TI_precount(4,%r9),__TI_precount(%r9)607608 b BASED(io_resume_loop)608609#endif609610···614615 l %r1,__LC_KERNEL_STACK615616 s %r1,BASED(.Lc_spsize)616617 mvc SP_PTREGS(__PT_SIZE,%r1),SP_PTREGS(%r15)617617- xc __SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1) # clear back chain618618+ xc __SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1) # clear back chain618619 lr %r15,%r1619620#620621# One of the work bits is on. Find out which one.621622# Checked are: _TIF_SIGPENDING, _TIF_RESTORE_SIGMASK, _TIF_NEED_RESCHED622622-# and _TIF_MCCK_PENDING623623+# and _TIF_MCCK_PENDING623624#624625io_work_loop:625626 tm __TI_flags+3(%r9),_TIF_MCCK_PENDING626626- bo BASED(io_mcck_pending)627627+ bo BASED(io_mcck_pending)627628 tm __TI_flags+3(%r9),_TIF_NEED_RESCHED628629 bo BASED(io_reschedule)629630 tm __TI_flags+3(%r9),(_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)···636637io_mcck_pending:637638 l %r1,BASED(.Ls390_handle_mcck)638639 la %r14,BASED(io_work_loop)639639- br %r1 # TIF bit will be cleared by handler640640+ br %r1 # TIF bit will be cleared by handler640641641642#642643# _TIF_NEED_RESCHED is set, call schedule643643-# 644644-io_reschedule: 645645- l %r1,BASED(.Lschedule)646646- stosm __SF_EMPTY(%r15),0x03 # reenable interrupts647647- basr %r14,%r1 # call scheduler648648- stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts644644+#645645+io_reschedule:646646+ l %r1,BASED(.Lschedule)647647+ stosm __SF_EMPTY(%r15),0x03 # reenable interrupts648648+ basr %r14,%r1 # call scheduler649649+ stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts649650 tm __TI_flags+3(%r9),_TIF_WORK_INT650650- bz BASED(io_leave) # there is no work to do651651+ bz BASED(io_leave) # there is no work to do651652 b BASED(io_work_loop)652653653654#654655# _TIF_SIGPENDING or _TIF_RESTORE_SIGMASK is set, call do_signal655656#656656-io_sigpending: 657657- stosm __SF_EMPTY(%r15),0x03 # reenable interrupts658658- la %r2,SP_PTREGS(%r15) # load pt_regs659659- l %r1,BASED(.Ldo_signal)660660- basr %r14,%r1 # call do_signal661661- stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts657657+io_sigpending:658658+ stosm __SF_EMPTY(%r15),0x03 # reenable interrupts659659+ la %r2,SP_PTREGS(%r15) # load pt_regs660660+ l %r1,BASED(.Ldo_signal)661661+ basr %r14,%r1 # call do_signal662662+ stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts662663 b BASED(io_work_loop)663664664665/*665666 * External interrupt handler routine666667 */667668668668- .globl ext_int_handler669669+ .globl ext_int_handler669670ext_int_handler:670671 STORE_TIMER __LC_ASYNC_ENTER_TIMER671672 stck __LC_INT_CLOCK···682683#endif683684 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct684685 TRACE_IRQS_OFF685685- la %r2,SP_PTREGS(%r15) # address of register-save area686686- lh %r3,__LC_EXT_INT_CODE # get interruption code686686+ la %r2,SP_PTREGS(%r15) # address of register-save area687687+ lh %r3,__LC_EXT_INT_CODE # get interruption code687688 l %r1,BASED(.Ldo_extint)688689 basr %r14,%r1689690 TRACE_IRQS_ON···695696 * Machine check handler routines696697 */697698698698- .globl mcck_int_handler699699+ .globl mcck_int_handler699700mcck_int_handler:700701 spt __LC_CPU_TIMER_SAVE_AREA # revalidate cpu timer701702 lm %r0,%r15,__LC_GPREGS_SAVE_AREA # revalidate gprs702703 SAVE_ALL_BASE __LC_SAVE_AREA+32703704 la %r12,__LC_MCK_OLD_PSW704704- tm __LC_MCCK_CODE,0x80 # system damage?705705+ tm __LC_MCCK_CODE,0x80 # system damage?705706 bo BASED(mcck_int_main) # yes -> rest of mcck code invalid706707#ifdef CONFIG_VIRT_CPU_ACCOUNTING707708 mvc __LC_SAVE_AREA+52(8),__LC_ASYNC_ENTER_TIMER···740741 l %r15,__LC_PANIC_STACK # load panic stack7417420: CREATE_STACK_FRAME __LC_MCK_OLD_PSW,__LC_SAVE_AREA+32742743#ifdef CONFIG_VIRT_CPU_ACCOUNTING743743- tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid?744744+ tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid?744745 bno BASED(mcck_no_vtime) # no -> skip cleanup critical745746 tm SP_PSW+1(%r15),0x01 # interrupting from user ?746747 bz BASED(mcck_no_vtime)···751752#endif752753 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct753754 la %r2,SP_PTREGS(%r15) # load pt_regs754754- l %r1,BASED(.Ls390_mcck)755755- basr %r14,%r1 # call machine check handler756756- tm SP_PSW+1(%r15),0x01 # returning to user ?755755+ l %r1,BASED(.Ls390_mcck)756756+ basr %r14,%r1 # call machine check handler757757+ tm SP_PSW+1(%r15),0x01 # returning to user ?757758 bno BASED(mcck_return)758758- l %r1,__LC_KERNEL_STACK # switch to kernel stack759759+ l %r1,__LC_KERNEL_STACK # switch to kernel stack759760 s %r1,BASED(.Lc_spsize)760761 mvc SP_PTREGS(__PT_SIZE,%r1),SP_PTREGS(%r15)761761- xc __SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1) # clear back chain762762+ xc __SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1) # clear back chain762763 lr %r15,%r1763764 stosm __SF_EMPTY(%r15),0x04 # turn dat on764765 tm __TI_flags+3(%r9),_TIF_MCCK_PENDING···782783 lm %r0,%r15,SP_R0(%r15) # load gprs 0-15783784 lpsw __LC_RETURN_MCCK_PSW # back to caller784785785785- RESTORE_ALL __LC_RETURN_MCCK_PSW,0786786+ RESTORE_ALL __LC_RETURN_MCCK_PSW,0786787787788#ifdef CONFIG_SMP788789/*789790 * Restart interruption handler, kick starter for additional CPUs790791 */791791- .globl restart_int_handler792792+ .globl restart_int_handler792793restart_int_handler:793793- l %r15,__LC_SAVE_AREA+60 # load ksp794794- lctl %c0,%c15,__LC_CREGS_SAVE_AREA # get new ctl regs795795- lam %a0,%a15,__LC_AREGS_SAVE_AREA796796- lm %r6,%r15,__SF_GPRS(%r15) # load registers from clone797797- stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on798798- basr %r14,0799799- l %r14,restart_addr-.(%r14)800800- br %r14 # branch to start_secondary794794+ l %r15,__LC_SAVE_AREA+60 # load ksp795795+ lctl %c0,%c15,__LC_CREGS_SAVE_AREA # get new ctl regs796796+ lam %a0,%a15,__LC_AREGS_SAVE_AREA797797+ lm %r6,%r15,__SF_GPRS(%r15) # load registers from clone798798+ stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on799799+ basr %r14,0800800+ l %r14,restart_addr-.(%r14)801801+ br %r14 # branch to start_secondary801802restart_addr:802802- .long start_secondary803803+ .long start_secondary803804#else804805/*805806 * If we do not run with SMP enabled, let the new CPU crash ...806807 */807807- .globl restart_int_handler808808+ .globl restart_int_handler808809restart_int_handler:809809- basr %r1,0810810+ basr %r1,0810811restart_base:811811- lpsw restart_crash-restart_base(%r1)812812- .align 8812812+ lpsw restart_crash-restart_base(%r1)813813+ .align 8813814restart_crash:814814- .long 0x000a0000,0x00000000815815+ .long 0x000a0000,0x00000000815816restart_go:816817#endif817818···833834 be BASED(0f)834835 la %r1,__LC_SAVE_AREA+168358360: mvc SP_R12(16,%r15),0(%r1) # move %r12-%r15 to stack836836- xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear back chain837837+ xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear back chain837838 l %r1,BASED(1f) # branch to kernel_stack_overflow838838- la %r2,SP_PTREGS(%r15) # load pt_regs839839+ la %r2,SP_PTREGS(%r15) # load pt_regs839840 br %r1840840-1: .long kernel_stack_overflow841841+1: .long kernel_stack_overflow841842#endif842843843844cleanup_table_system_call:···939940cleanup_system_call_insn:940941 .long sysc_saveall + 0x80000000941942#ifdef CONFIG_VIRT_CPU_ACCOUNTING942942- .long system_call + 0x80000000943943- .long sysc_vtime + 0x80000000944944- .long sysc_stime + 0x80000000945945- .long sysc_update + 0x80000000943943+ .long system_call + 0x80000000944944+ .long sysc_vtime + 0x80000000945945+ .long sysc_stime + 0x80000000946946+ .long sysc_update + 0x80000000946947#endif947948948949cleanup_sysc_return:···10081009/*10091010 * Integer constants10101011 */10111011- .align 410121012-.Lc_spsize: .long SP_SIZE10131013-.Lc_overhead: .long STACK_FRAME_OVERHEAD10141014-.Lc_pactive: .long PREEMPT_ACTIVE10151015-.Lnr_syscalls: .long NR_syscalls10161016-.L0x018: .short 0x01810171017-.L0x020: .short 0x02010181018-.L0x028: .short 0x02810191019-.L0x030: .short 0x03010201020-.L0x038: .short 0x03810211021-.Lc_1: .long 110121012+ .align 410131013+.Lc_spsize: .long SP_SIZE10141014+.Lc_overhead: .long STACK_FRAME_OVERHEAD10151015+.Lc_pactive: .long PREEMPT_ACTIVE10161016+.Lnr_syscalls: .long NR_syscalls10171017+.L0x018: .short 0x01810181018+.L0x020: .short 0x02010191019+.L0x028: .short 0x02810201020+.L0x030: .short 0x03010211021+.L0x038: .short 0x03810221022+.Lc_1: .long 11022102310231024/*10241025 * Symbol constants10251026 */10261026-.Ls390_mcck: .long s390_do_machine_check10271027+.Ls390_mcck: .long s390_do_machine_check10271028.Ls390_handle_mcck:10281028- .long s390_handle_mcck10291029-.Lmck_old_psw: .long __LC_MCK_OLD_PSW10301030-.Ldo_IRQ: .long do_IRQ10311031-.Ldo_extint: .long do_extint10321032-.Ldo_signal: .long do_signal10331033-.Lhandle_per: .long do_single_step10341034-.Ljump_table: .long pgm_check_table10351035-.Lschedule: .long schedule10361036-.Lclone: .long sys_clone10371037-.Lexecve: .long sys_execve10381038-.Lfork: .long sys_fork10391039-.Lrt_sigreturn:.long sys_rt_sigreturn10291029+ .long s390_handle_mcck10301030+.Lmck_old_psw: .long __LC_MCK_OLD_PSW10311031+.Ldo_IRQ: .long do_IRQ10321032+.Ldo_extint: .long do_extint10331033+.Ldo_signal: .long do_signal10341034+.Lhandle_per: .long do_single_step10351035+.Ljump_table: .long pgm_check_table10361036+.Lschedule: .long schedule10371037+.Lclone: .long sys_clone10381038+.Lexecve: .long sys_execve10391039+.Lfork: .long sys_fork10401040+.Lrt_sigreturn: .long sys_rt_sigreturn10401041.Lrt_sigsuspend:10411041- .long sys_rt_sigsuspend10421042-.Lsigreturn: .long sys_sigreturn10431043-.Lsigsuspend: .long sys_sigsuspend10441044-.Lsigaltstack: .long sys_sigaltstack10451045-.Ltrace: .long syscall_trace10461046-.Lvfork: .long sys_vfork10471047-.Lschedtail: .long schedule_tail10481048-.Lsysc_table: .long sys_call_table10421042+ .long sys_rt_sigsuspend10431043+.Lsigreturn: .long sys_sigreturn10441044+.Lsigsuspend: .long sys_sigsuspend10451045+.Lsigaltstack: .long sys_sigaltstack10461046+.Ltrace: .long syscall_trace10471047+.Lvfork: .long sys_vfork10481048+.Lschedtail: .long schedule_tail10491049+.Lsysc_table: .long sys_call_table10491050#ifdef CONFIG_TRACE_IRQFLAGS10501050-.Ltrace_irq_on:.long trace_hardirqs_on10511051+.Ltrace_irq_on: .long trace_hardirqs_on10511052.Ltrace_irq_off:10521052- .long trace_hardirqs_off10531053+ .long trace_hardirqs_off10531054#endif10541055.Lcritical_start:10551055- .long __critical_start + 0x8000000010561056+ .long __critical_start + 0x8000000010561057.Lcritical_end:10571057- .long __critical_end + 0x8000000010581058+ .long __critical_end + 0x8000000010581059.Lcleanup_critical:10591059- .long cleanup_critical10601060+ .long cleanup_critical1060106110611061- .section .rodata, "a"10621062+ .section .rodata, "a"10621063#define SYSCALL(esa,esame,emu) .long esa10631064sys_call_table:10641065#include "syscalls.S"
+219-220
arch/s390/kernel/entry64.S
···44 *55 * Copyright (C) IBM Corp. 1999,200666 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),77- * Hartmut Penner (hp@de.ibm.com),88- * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),77+ * Hartmut Penner (hp@de.ibm.com),88+ * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),99 * Heiko Carstens <heiko.carstens@de.ibm.com>1010 */1111···2424 * Stack layout for the system_call stack entry.2525 * The first few entries are identical to the user_regs_struct.2626 */2727-SP_PTREGS = STACK_FRAME_OVERHEAD2828-SP_ARGS = STACK_FRAME_OVERHEAD + __PT_ARGS2929-SP_PSW = STACK_FRAME_OVERHEAD + __PT_PSW3030-SP_R0 = STACK_FRAME_OVERHEAD + __PT_GPRS3131-SP_R1 = STACK_FRAME_OVERHEAD + __PT_GPRS + 83232-SP_R2 = STACK_FRAME_OVERHEAD + __PT_GPRS + 163333-SP_R3 = STACK_FRAME_OVERHEAD + __PT_GPRS + 243434-SP_R4 = STACK_FRAME_OVERHEAD + __PT_GPRS + 323535-SP_R5 = STACK_FRAME_OVERHEAD + __PT_GPRS + 403636-SP_R6 = STACK_FRAME_OVERHEAD + __PT_GPRS + 483737-SP_R7 = STACK_FRAME_OVERHEAD + __PT_GPRS + 563838-SP_R8 = STACK_FRAME_OVERHEAD + __PT_GPRS + 643939-SP_R9 = STACK_FRAME_OVERHEAD + __PT_GPRS + 724040-SP_R10 = STACK_FRAME_OVERHEAD + __PT_GPRS + 804141-SP_R11 = STACK_FRAME_OVERHEAD + __PT_GPRS + 884242-SP_R12 = STACK_FRAME_OVERHEAD + __PT_GPRS + 964343-SP_R13 = STACK_FRAME_OVERHEAD + __PT_GPRS + 1044444-SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 1124545-SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 1204646-SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR24747-SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC4848-SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP4949-SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE2727+SP_PTREGS = STACK_FRAME_OVERHEAD2828+SP_ARGS = STACK_FRAME_OVERHEAD + __PT_ARGS2929+SP_PSW = STACK_FRAME_OVERHEAD + __PT_PSW3030+SP_R0 = STACK_FRAME_OVERHEAD + __PT_GPRS3131+SP_R1 = STACK_FRAME_OVERHEAD + __PT_GPRS + 83232+SP_R2 = STACK_FRAME_OVERHEAD + __PT_GPRS + 163333+SP_R3 = STACK_FRAME_OVERHEAD + __PT_GPRS + 243434+SP_R4 = STACK_FRAME_OVERHEAD + __PT_GPRS + 323535+SP_R5 = STACK_FRAME_OVERHEAD + __PT_GPRS + 403636+SP_R6 = STACK_FRAME_OVERHEAD + __PT_GPRS + 483737+SP_R7 = STACK_FRAME_OVERHEAD + __PT_GPRS + 563838+SP_R8 = STACK_FRAME_OVERHEAD + __PT_GPRS + 643939+SP_R9 = STACK_FRAME_OVERHEAD + __PT_GPRS + 724040+SP_R10 = STACK_FRAME_OVERHEAD + __PT_GPRS + 804141+SP_R11 = STACK_FRAME_OVERHEAD + __PT_GPRS + 884242+SP_R12 = STACK_FRAME_OVERHEAD + __PT_GPRS + 964343+SP_R13 = STACK_FRAME_OVERHEAD + __PT_GPRS + 1044444+SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 1124545+SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 1204646+SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR24747+SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC4848+SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP4949+SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE50505151STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER5252STACK_SIZE = 1 << STACK_SHIFT···7171#define TRACE_IRQS_OFF7272#endif73737474- .macro STORE_TIMER lc_offset7474+ .macro STORE_TIMER lc_offset7575#ifdef CONFIG_VIRT_CPU_ACCOUNTING7676 stpt \lc_offset7777#endif7878 .endm79798080#ifdef CONFIG_VIRT_CPU_ACCOUNTING8181- .macro UPDATE_VTIME lc_from,lc_to,lc_sum8181+ .macro UPDATE_VTIME lc_from,lc_to,lc_sum8282 lg %r10,\lc_from8383 slg %r10,\lc_to8484 alg %r10,\lc_sum···9494 * R15 - kernel stack pointer9595 */96969797- .macro SAVE_ALL_BASE savearea9797+ .macro SAVE_ALL_BASE savearea9898 stmg %r12,%r15,\savearea9999 larl %r13,system_call100100 .endm···139139 .endm140140141141 .macro CREATE_STACK_FRAME psworg,savearea142142- aghi %r15,-SP_SIZE # make room for registers & psw143143- mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack142142+ aghi %r15,-SP_SIZE # make room for registers & psw143143+ mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack144144 la %r12,\psworg145145 stg %r2,SP_ORIG_R2(%r15) # store original content of gpr 2146146 icm %r12,12,__LC_SVC_ILC···149149 mvc SP_R12(32,%r15),\savearea # move %r12-%r15 to stack150150 la %r12,0151151 stg %r12,__SF_BACKCHAIN(%r15)152152- .endm152152+ .endm153153154154 .macro RESTORE_ALL psworg,sync155155 mvc \psworg(16),SP_PSW(%r15) # move user PSW to lowcore···168168 * Returns:169169 * gpr2 = prev170170 */171171- .globl __switch_to171171+ .globl __switch_to172172__switch_to:173173 tm __THREAD_per+4(%r3),0xe8 # is the new process using per ?174174 jz __switch_to_noper # if not we're fine175175- stctg %c9,%c11,__SF_EMPTY(%r15)# We are using per stuff176176- clc __THREAD_per(24,%r3),__SF_EMPTY(%r15)177177- je __switch_to_noper # we got away without bashing TLB's178178- lctlg %c9,%c11,__THREAD_per(%r3) # Nope we didn't175175+ stctg %c9,%c11,__SF_EMPTY(%r15)# We are using per stuff176176+ clc __THREAD_per(24,%r3),__SF_EMPTY(%r15)177177+ je __switch_to_noper # we got away without bashing TLB's178178+ lctlg %c9,%c11,__THREAD_per(%r3) # Nope we didn't179179__switch_to_noper:180180- lg %r4,__THREAD_info(%r2) # get thread_info of prev180180+ lg %r4,__THREAD_info(%r2) # get thread_info of prev181181 tm __TI_flags+7(%r4),_TIF_MCCK_PENDING # machine check pending?182182 jz __switch_to_no_mcck183183 ni __TI_flags+7(%r4),255-_TIF_MCCK_PENDING # clear flag in prev184184 lg %r4,__THREAD_info(%r3) # get thread_info of next185185 oi __TI_flags+7(%r4),_TIF_MCCK_PENDING # set it in next186186__switch_to_no_mcck:187187- stmg %r6,%r15,__SF_GPRS(%r15)# store __switch_to registers of prev task187187+ stmg %r6,%r15,__SF_GPRS(%r15)# store __switch_to registers of prev task188188 stg %r15,__THREAD_ksp(%r2) # store kernel stack to prev->tss.ksp189189 lg %r15,__THREAD_ksp(%r3) # load kernel stack from next->tss.ksp190190- lmg %r6,%r15,__SF_GPRS(%r15)# load __switch_to registers of next task190190+ lmg %r6,%r15,__SF_GPRS(%r15)# load __switch_to registers of next task191191 stg %r3,__LC_CURRENT # __LC_CURRENT = current task struct192192 lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4193193- lg %r3,__THREAD_info(%r3) # load thread_info from task struct193193+ lg %r3,__THREAD_info(%r3) # load thread_info from task struct194194 stg %r3,__LC_THREAD_INFO195195 aghi %r3,STACK_SIZE196196 stg %r3,__LC_KERNEL_STACK # __LC_KERNEL_STACK = new kernel stack···202202 * are executed with interrupts enabled.203203 */204204205205- .globl system_call205205+ .globl system_call206206system_call:207207 STORE_TIMER __LC_SYNC_ENTER_TIMER208208sysc_saveall:209209 SAVE_ALL_BASE __LC_SAVE_AREA210210 SAVE_ALL_SYNC __LC_SVC_OLD_PSW,__LC_SAVE_AREA211211- CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA212212- llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore211211+ CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA212212+ llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore213213#ifdef CONFIG_VIRT_CPU_ACCOUNTING214214sysc_vtime:215215 tm SP_PSW+1(%r15),0x01 # interrupting from user ?···222222#endif223223sysc_do_svc:224224 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct225225- slag %r7,%r7,2 # *4 and test for svc 0225225+ slag %r7,%r7,2 # *4 and test for svc 0226226 jnz sysc_nr_ok227227 # svc 0: system call number in %r1228228 cl %r1,BASED(.Lnr_syscalls)229229 jnl sysc_nr_ok230230- lgfr %r7,%r1 # clear high word in r1231231- slag %r7,%r7,2 # svc 0: system call number in %r1230230+ lgfr %r7,%r1 # clear high word in r1231231+ slag %r7,%r7,2 # svc 0: system call number in %r1232232sysc_nr_ok:233233 mvc SP_ARGS(8,%r15),SP_R7(%r15)234234sysc_do_restart:235235- larl %r10,sys_call_table235235+ larl %r10,sys_call_table236236#ifdef CONFIG_COMPAT237237 tm __TI_flags+5(%r9),(_TIF_31BIT>>16) # running in 31 bit mode ?238238 jno sysc_noemu239239- larl %r10,sys_call_table_emu # use 31 bit emulation system calls239239+ larl %r10,sys_call_table_emu # use 31 bit emulation system calls240240sysc_noemu:241241#endif242242 tm __TI_flags+7(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)243243- lgf %r8,0(%r7,%r10) # load address of system call routine244244- jnz sysc_tracesys245245- basr %r14,%r8 # call sys_xxxx246246- stg %r2,SP_R2(%r15) # store return value (change R2 on stack)247247- # ATTENTION: check sys_execve_glue before248248- # changing anything here !!243243+ lgf %r8,0(%r7,%r10) # load address of system call routine244244+ jnz sysc_tracesys245245+ basr %r14,%r8 # call sys_xxxx246246+ stg %r2,SP_R2(%r15) # store return value (change R2 on stack)247247+ # ATTENTION: check sys_execve_glue before248248+ # changing anything here !!249249250250sysc_return:251251- tm SP_PSW+1(%r15),0x01 # returning to user ?252252- jno sysc_leave251251+ tm SP_PSW+1(%r15),0x01 # returning to user ?252252+ jno sysc_leave253253 tm __TI_flags+7(%r9),_TIF_WORK_SVC254254- jnz sysc_work # there is work to do (signals etc.)254254+ jnz sysc_work # there is work to do (signals etc.)255255sysc_leave:256256- RESTORE_ALL __LC_RETURN_PSW,1256256+ RESTORE_ALL __LC_RETURN_PSW,1257257258258#259259# recheck if there is more work to do260260#261261sysc_work_loop:262262 tm __TI_flags+7(%r9),_TIF_WORK_SVC263263- jz sysc_leave # there is no work to do263263+ jz sysc_leave # there is no work to do264264#265265# One of the work bits is on. Find out which one.266266#···279279280280#281281# _TIF_NEED_RESCHED is set, call schedule282282-# 283283-sysc_reschedule: 284284- larl %r14,sysc_work_loop285285- jg schedule # return point is sysc_return282282+#283283+sysc_reschedule:284284+ larl %r14,sysc_work_loop285285+ jg schedule # return point is sysc_return286286287287#288288# _TIF_MCCK_PENDING is set, call handler289289#290290sysc_mcck_pending:291291 larl %r14,sysc_work_loop292292- jg s390_handle_mcck # TIF bit will be cleared by handler292292+ jg s390_handle_mcck # TIF bit will be cleared by handler293293294294#295295# _TIF_SIGPENDING or _TIF_RESTORE_SIGMASK is set, call do_signal296296#297297-sysc_sigpending: 297297+sysc_sigpending:298298 ni __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP299299- la %r2,SP_PTREGS(%r15) # load pt_regs300300- brasl %r14,do_signal # call do_signal299299+ la %r2,SP_PTREGS(%r15) # load pt_regs300300+ brasl %r14,do_signal # call do_signal301301 tm __TI_flags+7(%r9),_TIF_RESTART_SVC302302 jo sysc_restart303303 tm __TI_flags+7(%r9),_TIF_SINGLE_STEP···309309#310310sysc_restart:311311 ni __TI_flags+7(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC312312- lg %r7,SP_R2(%r15) # load new svc number313313- slag %r7,%r7,2 # *4312312+ lg %r7,SP_R2(%r15) # load new svc number313313+ slag %r7,%r7,2 # *4314314 mvc SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument315315- lmg %r2,%r6,SP_R2(%r15) # load svc arguments316316- j sysc_do_restart # restart svc315315+ lmg %r2,%r6,SP_R2(%r15) # load svc arguments316316+ j sysc_do_restart # restart svc317317318318#319319# _TIF_SINGLE_STEP is set, call do_single_step···326326 larl %r14,sysc_return # load adr. of system return327327 jg do_single_step # branch to do_sigtrap328328329329-330329#331330# call syscall_trace before and after system call332331# special linkage: %r12 contains the return address for trace_svc333332#334333sysc_tracesys:335335- la %r2,SP_PTREGS(%r15) # load pt_regs334334+ la %r2,SP_PTREGS(%r15) # load pt_regs336335 la %r3,0337336 srl %r7,2338338- stg %r7,SP_R2(%r15)339339- brasl %r14,syscall_trace337337+ stg %r7,SP_R2(%r15)338338+ brasl %r14,syscall_trace340339 lghi %r0,NR_syscalls341340 clg %r0,SP_R2(%r15)342341 jnh sysc_tracenogo343343- lg %r7,SP_R2(%r15) # strace might have changed the344344- sll %r7,2 # system call342342+ lg %r7,SP_R2(%r15) # strace might have changed the343343+ sll %r7,2 # system call345344 lgf %r8,0(%r7,%r10)346345sysc_tracego:347347- lmg %r3,%r6,SP_R3(%r15)348348- lg %r2,SP_ORIG_R2(%r15)349349- basr %r14,%r8 # call sys_xxx350350- stg %r2,SP_R2(%r15) # store return value346346+ lmg %r3,%r6,SP_R3(%r15)347347+ lg %r2,SP_ORIG_R2(%r15)348348+ basr %r14,%r8 # call sys_xxx349349+ stg %r2,SP_R2(%r15) # store return value351350sysc_tracenogo:352351 tm __TI_flags+7(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)353353- jz sysc_return354354- la %r2,SP_PTREGS(%r15) # load pt_regs352352+ jz sysc_return353353+ la %r2,SP_PTREGS(%r15) # load pt_regs355354 la %r3,1356356- larl %r14,sysc_return # return point is sysc_return355355+ larl %r14,sysc_return # return point is sysc_return357356 jg syscall_trace358357359358#360359# a new process exits the kernel with ret_from_fork361360#362362- .globl ret_from_fork361361+ .globl ret_from_fork363362ret_from_fork:364363 lg %r13,__LC_SVC_NEW_PSW+8365364 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct366365 tm SP_PSW+1(%r15),0x01 # forking a kernel thread ?367366 jo 0f368367 stg %r15,SP_R15(%r15) # store stack pointer for new kthread369369-0: brasl %r14,schedule_tail368368+0: brasl %r14,schedule_tail370369 TRACE_IRQS_ON371371- stosm 24(%r15),0x03 # reenable interrupts370370+ stosm 24(%r15),0x03 # reenable interrupts372371 j sysc_return373372374373#···376377# but are called with different parameter.377378# return-address is set up above378379#379379-sys_clone_glue: 380380- la %r2,SP_PTREGS(%r15) # load pt_regs381381- jg sys_clone # branch to sys_clone380380+sys_clone_glue:381381+ la %r2,SP_PTREGS(%r15) # load pt_regs382382+ jg sys_clone # branch to sys_clone382383383384#ifdef CONFIG_COMPAT384384-sys32_clone_glue: 385385- la %r2,SP_PTREGS(%r15) # load pt_regs386386- jg sys32_clone # branch to sys32_clone385385+sys32_clone_glue:386386+ la %r2,SP_PTREGS(%r15) # load pt_regs387387+ jg sys32_clone # branch to sys32_clone387388#endif388389389389-sys_fork_glue: 390390- la %r2,SP_PTREGS(%r15) # load pt_regs391391- jg sys_fork # branch to sys_fork390390+sys_fork_glue:391391+ la %r2,SP_PTREGS(%r15) # load pt_regs392392+ jg sys_fork # branch to sys_fork392393393393-sys_vfork_glue: 394394- la %r2,SP_PTREGS(%r15) # load pt_regs395395- jg sys_vfork # branch to sys_vfork394394+sys_vfork_glue:395395+ la %r2,SP_PTREGS(%r15) # load pt_regs396396+ jg sys_vfork # branch to sys_vfork396397397397-sys_execve_glue: 398398- la %r2,SP_PTREGS(%r15) # load pt_regs399399- lgr %r12,%r14 # save return address400400- brasl %r14,sys_execve # call sys_execve401401- ltgr %r2,%r2 # check if execve failed402402- bnz 0(%r12) # it did fail -> store result in gpr2403403- b 6(%r12) # SKIP STG 2,SP_R2(15) in404404- # system_call/sysc_tracesys398398+sys_execve_glue:399399+ la %r2,SP_PTREGS(%r15) # load pt_regs400400+ lgr %r12,%r14 # save return address401401+ brasl %r14,sys_execve # call sys_execve402402+ ltgr %r2,%r2 # check if execve failed403403+ bnz 0(%r12) # it did fail -> store result in gpr2404404+ b 6(%r12) # SKIP STG 2,SP_R2(15) in405405+ # system_call/sysc_tracesys405406#ifdef CONFIG_COMPAT406406-sys32_execve_glue: 407407- la %r2,SP_PTREGS(%r15) # load pt_regs408408- lgr %r12,%r14 # save return address409409- brasl %r14,sys32_execve # call sys32_execve410410- ltgr %r2,%r2 # check if execve failed411411- bnz 0(%r12) # it did fail -> store result in gpr2412412- b 6(%r12) # SKIP STG 2,SP_R2(15) in413413- # system_call/sysc_tracesys407407+sys32_execve_glue:408408+ la %r2,SP_PTREGS(%r15) # load pt_regs409409+ lgr %r12,%r14 # save return address410410+ brasl %r14,sys32_execve # call sys32_execve411411+ ltgr %r2,%r2 # check if execve failed412412+ bnz 0(%r12) # it did fail -> store result in gpr2413413+ b 6(%r12) # SKIP STG 2,SP_R2(15) in414414+ # system_call/sysc_tracesys414415#endif415416416416-sys_sigreturn_glue: 417417- la %r2,SP_PTREGS(%r15) # load pt_regs as parameter418418- jg sys_sigreturn # branch to sys_sigreturn417417+sys_sigreturn_glue:418418+ la %r2,SP_PTREGS(%r15) # load pt_regs as parameter419419+ jg sys_sigreturn # branch to sys_sigreturn419420420421#ifdef CONFIG_COMPAT421421-sys32_sigreturn_glue: 422422- la %r2,SP_PTREGS(%r15) # load pt_regs as parameter423423- jg sys32_sigreturn # branch to sys32_sigreturn422422+sys32_sigreturn_glue:423423+ la %r2,SP_PTREGS(%r15) # load pt_regs as parameter424424+ jg sys32_sigreturn # branch to sys32_sigreturn424425#endif425426426426-sys_rt_sigreturn_glue: 427427- la %r2,SP_PTREGS(%r15) # load pt_regs as parameter428428- jg sys_rt_sigreturn # branch to sys_sigreturn427427+sys_rt_sigreturn_glue:428428+ la %r2,SP_PTREGS(%r15) # load pt_regs as parameter429429+ jg sys_rt_sigreturn # branch to sys_sigreturn429430430431#ifdef CONFIG_COMPAT431431-sys32_rt_sigreturn_glue: 432432- la %r2,SP_PTREGS(%r15) # load pt_regs as parameter433433- jg sys32_rt_sigreturn # branch to sys32_sigreturn432432+sys32_rt_sigreturn_glue:433433+ la %r2,SP_PTREGS(%r15) # load pt_regs as parameter434434+ jg sys32_rt_sigreturn # branch to sys32_sigreturn434435#endif435436436437sys_sigaltstack_glue:437437- la %r4,SP_PTREGS(%r15) # load pt_regs as parameter438438- jg sys_sigaltstack # branch to sys_sigreturn438438+ la %r4,SP_PTREGS(%r15) # load pt_regs as parameter439439+ jg sys_sigaltstack # branch to sys_sigreturn439440440441#ifdef CONFIG_COMPAT441442sys32_sigaltstack_glue:442442- la %r4,SP_PTREGS(%r15) # load pt_regs as parameter443443- jg sys32_sigaltstack_wrapper # branch to sys_sigreturn443443+ la %r4,SP_PTREGS(%r15) # load pt_regs as parameter444444+ jg sys32_sigaltstack_wrapper # branch to sys_sigreturn444445#endif445446446447/*447448 * Program check handler routine448449 */449450450450- .globl pgm_check_handler451451+ .globl pgm_check_handler451452pgm_check_handler:452453/*453454 * First we need to check for a special case:···464465 */465466 STORE_TIMER __LC_SYNC_ENTER_TIMER466467 SAVE_ALL_BASE __LC_SAVE_AREA467467- tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception468468- jnz pgm_per # got per exception -> special case468468+ tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception469469+ jnz pgm_per # got per exception -> special case469470 SAVE_ALL_SYNC __LC_PGM_OLD_PSW,__LC_SAVE_AREA470471 CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA471472#ifdef CONFIG_VIRT_CPU_ACCOUNTING···477478pgm_no_vtime:478479#endif479480 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct480480- lgf %r3,__LC_PGM_ILC # load program interruption code481481+ lgf %r3,__LC_PGM_ILC # load program interruption code481482 lghi %r8,0x7f482483 ngr %r8,%r3483484pgm_do_call:484484- sll %r8,3485485- larl %r1,pgm_check_table486486- lg %r1,0(%r8,%r1) # load address of handler routine487487- la %r2,SP_PTREGS(%r15) # address of register-save area485485+ sll %r8,3486486+ larl %r1,pgm_check_table487487+ lg %r1,0(%r8,%r1) # load address of handler routine488488+ la %r2,SP_PTREGS(%r15) # address of register-save area488489 larl %r14,sysc_return489489- br %r1 # branch to interrupt-handler490490+ br %r1 # branch to interrupt-handler490491491492#492493# handle per exception493494#494495pgm_per:495495- tm __LC_PGM_OLD_PSW,0x40 # test if per event recording is on496496- jnz pgm_per_std # ok, normal per event from user space496496+ tm __LC_PGM_OLD_PSW,0x40 # test if per event recording is on497497+ jnz pgm_per_std # ok, normal per event from user space497498# ok its one of the special cases, now we need to find out which one498498- clc __LC_PGM_OLD_PSW(16),__LC_SVC_NEW_PSW499499- je pgm_svcper499499+ clc __LC_PGM_OLD_PSW(16),__LC_SVC_NEW_PSW500500+ je pgm_svcper500501# no interesting special case, ignore PER event501502 lmg %r12,%r15,__LC_SAVE_AREA502502- lpswe __LC_PGM_OLD_PSW503503+ lpswe __LC_PGM_OLD_PSW503504504505#505506# Normal per exception···523524 mvc __THREAD_per+__PER_address(8,%r1),__LC_PER_ADDRESS524525 mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID525526 oi __TI_flags+7(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP526526- lgf %r3,__LC_PGM_ILC # load program interruption code527527+ lgf %r3,__LC_PGM_ILC # load program interruption code527528 lghi %r8,0x7f528528- ngr %r8,%r3 # clear per-event-bit and ilc529529+ ngr %r8,%r3 # clear per-event-bit and ilc529530 je sysc_return530531 j pgm_do_call531532···543544 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER544545pgm_no_vtime3:545546#endif546546- llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore547547+ llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore547548 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct548549 lg %r1,__TI_task(%r9)549550 mvc __THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID···567568/*568569 * IO interrupt handler routine569570 */570570- .globl io_int_handler571571+ .globl io_int_handler571572io_int_handler:572573 STORE_TIMER __LC_ASYNC_ENTER_TIMER573574 stck __LC_INT_CLOCK···584585#endif585586 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct586587 TRACE_IRQS_OFF587587- la %r2,SP_PTREGS(%r15) # address of register-save area588588- brasl %r14,do_IRQ # call standard irq handler588588+ la %r2,SP_PTREGS(%r15) # address of register-save area589589+ brasl %r14,do_IRQ # call standard irq handler589590 TRACE_IRQS_ON590591591592io_return:592592- tm SP_PSW+1(%r15),0x01 # returning to user ?593593+ tm SP_PSW+1(%r15),0x01 # returning to user ?593594#ifdef CONFIG_PREEMPT594594- jno io_preempt # no -> check for preemptive scheduling595595+ jno io_preempt # no -> check for preemptive scheduling595596#else596596- jno io_leave # no-> skip resched & signal597597+ jno io_leave # no-> skip resched & signal597598#endif598599 tm __TI_flags+7(%r9),_TIF_WORK_INT599599- jnz io_work # there is work to do (signals etc.)600600+ jnz io_work # there is work to do (signals etc.)600601io_leave:601601- RESTORE_ALL __LC_RETURN_PSW,0602602+ RESTORE_ALL __LC_RETURN_PSW,0602603io_done:603604604605#ifdef CONFIG_PREEMPT605606io_preempt:606606- icm %r0,15,__TI_precount(%r9) 607607- jnz io_leave607607+ icm %r0,15,__TI_precount(%r9)608608+ jnz io_leave608609 # switch to kernel stack609610 lg %r1,SP_R15(%r15)610611 aghi %r1,-SP_SIZE611612 mvc SP_PTREGS(__PT_SIZE,%r1),SP_PTREGS(%r15)612612- xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) # clear back chain613613+ xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) # clear back chain613614 lgr %r15,%r1614615io_resume_loop:615616 tm __TI_flags+7(%r9),_TIF_NEED_RESCHED616617 jno io_leave617617- larl %r1,.Lc_pactive618618- mvc __TI_precount(4,%r9),0(%r1)619619- stosm __SF_EMPTY(%r15),0x03 # reenable interrupts620620- brasl %r14,schedule # call schedule621621- stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts622622- xc __TI_precount(4,%r9),__TI_precount(%r9)618618+ larl %r1,.Lc_pactive619619+ mvc __TI_precount(4,%r9),0(%r1)620620+ stosm __SF_EMPTY(%r15),0x03 # reenable interrupts621621+ brasl %r14,schedule # call schedule622622+ stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts623623+ xc __TI_precount(4,%r9),__TI_precount(%r9)623624 j io_resume_loop624625#endif625626···630631 lg %r1,__LC_KERNEL_STACK631632 aghi %r1,-SP_SIZE632633 mvc SP_PTREGS(__PT_SIZE,%r1),SP_PTREGS(%r15)633633- xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) # clear back chain634634+ xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) # clear back chain634635 lgr %r15,%r1635636#636637# One of the work bits is on. Find out which one.···655656656657#657658# _TIF_NEED_RESCHED is set, call schedule658658-# 659659-io_reschedule: 660660- stosm __SF_EMPTY(%r15),0x03 # reenable interrupts661661- brasl %r14,schedule # call scheduler662662- stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts659659+#660660+io_reschedule:661661+ stosm __SF_EMPTY(%r15),0x03 # reenable interrupts662662+ brasl %r14,schedule # call scheduler663663+ stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts663664 tm __TI_flags+7(%r9),_TIF_WORK_INT664665 jz io_leave # there is no work to do665666 j io_work_loop···667668#668669# _TIF_SIGPENDING or _TIF_RESTORE_SIGMASK is set, call do_signal669670#670670-io_sigpending: 671671- stosm __SF_EMPTY(%r15),0x03 # reenable interrupts672672- la %r2,SP_PTREGS(%r15) # load pt_regs671671+io_sigpending:672672+ stosm __SF_EMPTY(%r15),0x03 # reenable interrupts673673+ la %r2,SP_PTREGS(%r15) # load pt_regs673674 brasl %r14,do_signal # call do_signal674674- stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts675675+ stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts675676 j io_work_loop676677677678/*678679 * External interrupt handler routine679680 */680680- .globl ext_int_handler681681+ .globl ext_int_handler681682ext_int_handler:682683 STORE_TIMER __LC_ASYNC_ENTER_TIMER683684 stck __LC_INT_CLOCK···694695#endif695696 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct696697 TRACE_IRQS_OFF697697- la %r2,SP_PTREGS(%r15) # address of register-save area698698- llgh %r3,__LC_EXT_INT_CODE # get interruption code699699- brasl %r14,do_extint698698+ la %r2,SP_PTREGS(%r15) # address of register-save area699699+ llgh %r3,__LC_EXT_INT_CODE # get interruption code700700+ brasl %r14,do_extint700701 TRACE_IRQS_ON701702 j io_return702703···705706/*706707 * Machine check handler routines707708 */708708- .globl mcck_int_handler709709+ .globl mcck_int_handler709710mcck_int_handler:710711 la %r1,4095 # revalidate r1711712 spt __LC_CPU_TIMER_SAVE_AREA-4095(%r1) # revalidate cpu timer712712- lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs713713+ lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs713714 SAVE_ALL_BASE __LC_SAVE_AREA+64714715 la %r12,__LC_MCK_OLD_PSW715715- tm __LC_MCCK_CODE,0x80 # system damage?716716+ tm __LC_MCCK_CODE,0x80 # system damage?716717 jo mcck_int_main # yes -> rest of mcck code invalid717718#ifdef CONFIG_VIRT_CPU_ACCOUNTING718719 la %r14,4095···736737#endif737738 tm __LC_MCCK_CODE+2,0x09 # mwp + ia of old psw valid?738739 jno mcck_int_main # no -> skip cleanup critical739739- tm __LC_MCK_OLD_PSW+1,0x01 # test problem state bit740740+ tm __LC_MCK_OLD_PSW+1,0x01 # test problem state bit740741 jnz mcck_int_main # from user -> load kernel stack741742 clc __LC_MCK_OLD_PSW+8(8),BASED(.Lcritical_end)742743 jhe mcck_int_main743743- clc __LC_MCK_OLD_PSW+8(8),BASED(.Lcritical_start)744744+ clc __LC_MCK_OLD_PSW+8(8),BASED(.Lcritical_start)744745 jl mcck_int_main745745- brasl %r14,cleanup_critical746746+ brasl %r14,cleanup_critical746747mcck_int_main:747747- lg %r14,__LC_PANIC_STACK # are we already on the panic stack?748748+ lg %r14,__LC_PANIC_STACK # are we already on the panic stack?748749 slgr %r14,%r15749750 srag %r14,%r14,PAGE_SHIFT750751 jz 0f751751- lg %r15,__LC_PANIC_STACK # load panic stack752752+ lg %r15,__LC_PANIC_STACK # load panic stack7527530: CREATE_STACK_FRAME __LC_MCK_OLD_PSW,__LC_SAVE_AREA+64753754#ifdef CONFIG_VIRT_CPU_ACCOUNTING754755 tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid?···763764 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct764765 la %r2,SP_PTREGS(%r15) # load pt_regs765766 brasl %r14,s390_do_machine_check766766- tm SP_PSW+1(%r15),0x01 # returning to user ?767767+ tm SP_PSW+1(%r15),0x01 # returning to user ?767768 jno mcck_return768769 lg %r1,__LC_KERNEL_STACK # switch to kernel stack769770 aghi %r1,-SP_SIZE···793794/*794795 * Restart interruption handler, kick starter for additional CPUs795796 */796796- .globl restart_int_handler797797+ .globl restart_int_handler797798restart_int_handler:798798- lg %r15,__LC_SAVE_AREA+120 # load ksp799799- lghi %r10,__LC_CREGS_SAVE_AREA800800- lctlg %c0,%c15,0(%r10) # get new ctl regs801801- lghi %r10,__LC_AREGS_SAVE_AREA802802- lam %a0,%a15,0(%r10)803803- lmg %r6,%r15,__SF_GPRS(%r15) # load registers from clone804804- stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on805805- jg start_secondary799799+ lg %r15,__LC_SAVE_AREA+120 # load ksp800800+ lghi %r10,__LC_CREGS_SAVE_AREA801801+ lctlg %c0,%c15,0(%r10) # get new ctl regs802802+ lghi %r10,__LC_AREGS_SAVE_AREA803803+ lam %a0,%a15,0(%r10)804804+ lmg %r6,%r15,__SF_GPRS(%r15) # load registers from clone805805+ stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on806806+ jg start_secondary806807#else807808/*808809 * If we do not run with SMP enabled, let the new CPU crash ...809810 */810810- .globl restart_int_handler811811+ .globl restart_int_handler811812restart_int_handler:812812- basr %r1,0813813+ basr %r1,0813814restart_base:814814- lpswe restart_crash-restart_base(%r1)815815- .align 8815815+ lpswe restart_crash-restart_base(%r1)816816+ .align 8816817restart_crash:817817- .long 0x000a0000,0x00000000,0x00000000,0x00000000818818+ .long 0x000a0000,0x00000000,0x00000000,0x00000000818819restart_go:819820#endif820821···835836 chi %r12,__LC_PGM_OLD_PSW836837 je 0f837838 la %r1,__LC_SAVE_AREA+32838838-0: mvc SP_R12(32,%r15),0(%r1) # move %r12-%r15 to stack839839- xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) # clear back chain840840- la %r2,SP_PTREGS(%r15) # load pt_regs839839+0: mvc SP_R12(32,%r15),0(%r1) # move %r12-%r15 to stack840840+ xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) # clear back chain841841+ la %r2,SP_PTREGS(%r15) # load pt_regs841842 jg kernel_stack_overflow842843#endif843844···940941cleanup_system_call_insn:941942 .quad sysc_saveall942943#ifdef CONFIG_VIRT_CPU_ACCOUNTING943943- .quad system_call944944- .quad sysc_vtime945945- .quad sysc_stime946946- .quad sysc_update944944+ .quad system_call945945+ .quad sysc_vtime946946+ .quad sysc_stime947947+ .quad sysc_update947948#endif948949949950cleanup_sysc_return:···10091010/*10101011 * Integer constants10111012 */10121012- .align 410131013+ .align 410131014.Lconst:10141014-.Lc_pactive: .long PREEMPT_ACTIVE10151015-.Lnr_syscalls: .long NR_syscalls10161016-.L0x0130: .short 0x13010171017-.L0x0140: .short 0x14010181018-.L0x0150: .short 0x15010191019-.L0x0160: .short 0x16010201020-.L0x0170: .short 0x17010151015+.Lc_pactive: .long PREEMPT_ACTIVE10161016+.Lnr_syscalls: .long NR_syscalls10171017+.L0x0130: .short 0x13010181018+.L0x0140: .short 0x14010191019+.L0x0150: .short 0x15010201020+.L0x0160: .short 0x16010211021+.L0x0170: .short 0x17010211022.Lcritical_start:10221022- .quad __critical_start10231023+ .quad __critical_start10231024.Lcritical_end:10241024- .quad __critical_end10251025+ .quad __critical_end1025102610261026- .section .rodata, "a"10271027+ .section .rodata, "a"10271028#define SYSCALL(esa,esame,emu) .long esame10281029sys_call_table:10291030#include "syscalls.S"
+312-312
arch/s390/kernel/head.S
···3636#endif37373838#ifndef CONFIG_IPL3939- .org 04040- .long 0x00080000,0x80000000+startup # Just a restart PSW3939+ .org 04040+ .long 0x00080000,0x80000000+startup # Just a restart PSW4141#else4242#ifdef CONFIG_IPL_TAPE4343#define IPL_BS 10244444- .org 04545- .long 0x00080000,0x80000000+iplstart # The first 24 bytes are loaded4646- .long 0x27000000,0x60000001 # by ipl to addresses 0-23.4747- .long 0x02000000,0x20000000+IPL_BS # (a PSW and two CCWs).4848- .long 0x00000000,0x00000000 # external old psw4949- .long 0x00000000,0x00000000 # svc old psw5050- .long 0x00000000,0x00000000 # program check old psw5151- .long 0x00000000,0x00000000 # machine check old psw5252- .long 0x00000000,0x00000000 # io old psw5353- .long 0x00000000,0x000000005454- .long 0x00000000,0x000000005555- .long 0x00000000,0x000000005656- .long 0x000a0000,0x00000058 # external new psw5757- .long 0x000a0000,0x00000060 # svc new psw5858- .long 0x000a0000,0x00000068 # program check new psw5959- .long 0x000a0000,0x00000070 # machine check new psw6060- .long 0x00080000,0x80000000+.Lioint # io new psw4444+ .org 04545+ .long 0x00080000,0x80000000+iplstart # The first 24 bytes are loaded4646+ .long 0x27000000,0x60000001 # by ipl to addresses 0-23.4747+ .long 0x02000000,0x20000000+IPL_BS # (a PSW and two CCWs).4848+ .long 0x00000000,0x00000000 # external old psw4949+ .long 0x00000000,0x00000000 # svc old psw5050+ .long 0x00000000,0x00000000 # program check old psw5151+ .long 0x00000000,0x00000000 # machine check old psw5252+ .long 0x00000000,0x00000000 # io old psw5353+ .long 0x00000000,0x000000005454+ .long 0x00000000,0x000000005555+ .long 0x00000000,0x000000005656+ .long 0x000a0000,0x00000058 # external new psw5757+ .long 0x000a0000,0x00000060 # svc new psw5858+ .long 0x000a0000,0x00000068 # program check new psw5959+ .long 0x000a0000,0x00000070 # machine check new psw6060+ .long 0x00080000,0x80000000+.Lioint # io new psw61616262- .org 0x1006262+ .org 0x1006363#6464# subroutine for loading from tape6565-# Paramters: 6565+# Paramters:6666# R1 = device number6767# R2 = load address6868-.Lloader: 6969- st %r14,.Lldret7070- la %r3,.Lorbread # r3 = address of orb 7171- la %r5,.Lirb # r5 = address of irb7272- st %r2,.Lccwread+4 # initialize CCW data addresses7373- lctl %c6,%c6,.Lcr6 7474- slr %r2,%r26868+.Lloader:6969+ st %r14,.Lldret7070+ la %r3,.Lorbread # r3 = address of orb7171+ la %r5,.Lirb # r5 = address of irb7272+ st %r2,.Lccwread+4 # initialize CCW data addresses7373+ lctl %c6,%c6,.Lcr67474+ slr %r2,%r27575.Lldlp:7676- la %r6,3 # 3 retries7676+ la %r6,3 # 3 retries7777.Lssch:7878- ssch 0(%r3) # load chunk of IPL_BS bytes7979- bnz .Llderr7878+ ssch 0(%r3) # load chunk of IPL_BS bytes7979+ bnz .Llderr8080.Lw4end:8181- bas %r14,.Lwait4io8282- tm 8(%r5),0x82 # do we have a problem ?8383- bnz .Lrecov8484- slr %r7,%r78585- icm %r7,3,10(%r5) # get residual count8686- lcr %r7,%r78787- la %r7,IPL_BS(%r7) # IPL_BS-residual=#bytes read8888- ar %r2,%r7 # add to total size8989- tm 8(%r5),0x01 # found a tape mark ?9090- bnz .Ldone9191- l %r0,.Lccwread+4 # update CCW data addresses9292- ar %r0,%r79393- st %r0,.Lccwread+4 9494- b .Lldlp8181+ bas %r14,.Lwait4io8282+ tm 8(%r5),0x82 # do we have a problem ?8383+ bnz .Lrecov8484+ slr %r7,%r78585+ icm %r7,3,10(%r5) # get residual count8686+ lcr %r7,%r78787+ la %r7,IPL_BS(%r7) # IPL_BS-residual=#bytes read8888+ ar %r2,%r7 # add to total size8989+ tm 8(%r5),0x01 # found a tape mark ?9090+ bnz .Ldone9191+ l %r0,.Lccwread+4 # update CCW data addresses9292+ ar %r0,%r79393+ st %r0,.Lccwread+49494+ b .Lldlp9595.Ldone:9696- l %r14,.Lldret9797- br %r14 # r2 contains the total size9696+ l %r14,.Lldret9797+ br %r14 # r2 contains the total size9898.Lrecov:9999- bas %r14,.Lsense # do the sensing100100- bct %r6,.Lssch # dec. retry count & branch101101- b .Llderr9999+ bas %r14,.Lsense # do the sensing100100+ bct %r6,.Lssch # dec. retry count & branch101101+ b .Llderr102102#103103# Sense subroutine104104#105105.Lsense:106106- st %r14,.Lsnsret107107- la %r7,.Lorbsense 108108- ssch 0(%r7) # start sense command109109- bnz .Llderr110110- bas %r14,.Lwait4io111111- l %r14,.Lsnsret112112- tm 8(%r5),0x82 # do we have a problem ?113113- bnz .Llderr114114- br %r14106106+ st %r14,.Lsnsret107107+ la %r7,.Lorbsense108108+ ssch 0(%r7) # start sense command109109+ bnz .Llderr110110+ bas %r14,.Lwait4io111111+ l %r14,.Lsnsret112112+ tm 8(%r5),0x82 # do we have a problem ?113113+ bnz .Llderr114114+ br %r14115115#116116# Wait for interrupt subroutine117117#118118.Lwait4io:119119- lpsw .Lwaitpsw 119119+ lpsw .Lwaitpsw120120.Lioint:121121- c %r1,0xb8 # compare subchannel number122122- bne .Lwait4io123123- tsch 0(%r5)124124- slr %r0,%r0125125- tm 8(%r5),0x82 # do we have a problem ?126126- bnz .Lwtexit127127- tm 8(%r5),0x04 # got device end ?128128- bz .Lwait4io121121+ c %r1,0xb8 # compare subchannel number122122+ bne .Lwait4io123123+ tsch 0(%r5)124124+ slr %r0,%r0125125+ tm 8(%r5),0x82 # do we have a problem ?126126+ bnz .Lwtexit127127+ tm 8(%r5),0x04 # got device end ?128128+ bz .Lwait4io129129.Lwtexit:130130- br %r14130130+ br %r14131131.Llderr:132132- lpsw .Lcrash 132132+ lpsw .Lcrash133133134134- .align 8134134+ .align 8135135.Lorbread:136136- .long 0x00000000,0x0080ff00,.Lccwread137137- .align 8136136+ .long 0x00000000,0x0080ff00,.Lccwread137137+ .align 8138138.Lorbsense:139139- .long 0x00000000,0x0080ff00,.Lccwsense140140- .align 8139139+ .long 0x00000000,0x0080ff00,.Lccwsense140140+ .align 8141141.Lccwread:142142- .long 0x02200000+IPL_BS,0x00000000142142+ .long 0x02200000+IPL_BS,0x00000000143143.Lccwsense:144144- .long 0x04200001,0x00000000144144+ .long 0x04200001,0x00000000145145.Lwaitpsw:146146- .long 0x020a0000,0x80000000+.Lioint146146+ .long 0x020a0000,0x80000000+.Lioint147147148148-.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0149149-.Lcr6: .long 0xff000000150150- .align 8151151-.Lcrash:.long 0x000a0000,0x00000000152152-.Lldret:.long 0148148+.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0149149+.Lcr6: .long 0xff000000150150+ .align 8151151+.Lcrash:.long 0x000a0000,0x00000000152152+.Lldret:.long 0153153.Lsnsret: .long 0154154-#endif /* CONFIG_IPL_TAPE */154154+#endif /* CONFIG_IPL_TAPE */155155156156#ifdef CONFIG_IPL_VM157157-#define IPL_BS 0x730158158- .org 0159159- .long 0x00080000,0x80000000+iplstart # The first 24 bytes are loaded160160- .long 0x02000018,0x60000050 # by ipl to addresses 0-23.161161- .long 0x02000068,0x60000050 # (a PSW and two CCWs).162162- .fill 80-24,1,0x40 # bytes 24-79 are discarded !!163163- .long 0x020000f0,0x60000050 # The next 160 byte are loaded164164- .long 0x02000140,0x60000050 # to addresses 0x18-0xb7165165- .long 0x02000190,0x60000050 # They form the continuation166166- .long 0x020001e0,0x60000050 # of the CCW program started167167- .long 0x02000230,0x60000050 # by ipl and load the range168168- .long 0x02000280,0x60000050 # 0x0f0-0x730 from the image169169- .long 0x020002d0,0x60000050 # to the range 0x0f0-0x730170170- .long 0x02000320,0x60000050 # in memory. At the end of171171- .long 0x02000370,0x60000050 # the channel program the PSW172172- .long 0x020003c0,0x60000050 # at location 0 is loaded.173173- .long 0x02000410,0x60000050 # Initial processing starts174174- .long 0x02000460,0x60000050 # at 0xf0 = iplstart.175175- .long 0x020004b0,0x60000050176176- .long 0x02000500,0x60000050177177- .long 0x02000550,0x60000050178178- .long 0x020005a0,0x60000050179179- .long 0x020005f0,0x60000050180180- .long 0x02000640,0x60000050181181- .long 0x02000690,0x60000050182182- .long 0x020006e0,0x20000050157157+#define IPL_BS 0x730158158+ .org 0159159+ .long 0x00080000,0x80000000+iplstart # The first 24 bytes are loaded160160+ .long 0x02000018,0x60000050 # by ipl to addresses 0-23.161161+ .long 0x02000068,0x60000050 # (a PSW and two CCWs).162162+ .fill 80-24,1,0x40 # bytes 24-79 are discarded !!163163+ .long 0x020000f0,0x60000050 # The next 160 byte are loaded164164+ .long 0x02000140,0x60000050 # to addresses 0x18-0xb7165165+ .long 0x02000190,0x60000050 # They form the continuation166166+ .long 0x020001e0,0x60000050 # of the CCW program started167167+ .long 0x02000230,0x60000050 # by ipl and load the range168168+ .long 0x02000280,0x60000050 # 0x0f0-0x730 from the image169169+ .long 0x020002d0,0x60000050 # to the range 0x0f0-0x730170170+ .long 0x02000320,0x60000050 # in memory. At the end of171171+ .long 0x02000370,0x60000050 # the channel program the PSW172172+ .long 0x020003c0,0x60000050 # at location 0 is loaded.173173+ .long 0x02000410,0x60000050 # Initial processing starts174174+ .long 0x02000460,0x60000050 # at 0xf0 = iplstart.175175+ .long 0x020004b0,0x60000050176176+ .long 0x02000500,0x60000050177177+ .long 0x02000550,0x60000050178178+ .long 0x020005a0,0x60000050179179+ .long 0x020005f0,0x60000050180180+ .long 0x02000640,0x60000050181181+ .long 0x02000690,0x60000050182182+ .long 0x020006e0,0x20000050183183184184- .org 0xf0184184+ .org 0xf0185185#186186# subroutine for loading cards from the reader187187#188188-.Lloader: 189189- la %r3,.Lorb # r2 = address of orb into r2190190- la %r5,.Lirb # r4 = address of irb191191- la %r6,.Lccws 192192- la %r7,20188188+.Lloader:189189+ la %r3,.Lorb # r2 = address of orb into r2190190+ la %r5,.Lirb # r4 = address of irb191191+ la %r6,.Lccws192192+ la %r7,20193193.Linit:194194- st %r2,4(%r6) # initialize CCW data addresses195195- la %r2,0x50(%r2)196196- la %r6,8(%r6)197197- bct 7,.Linit194194+ st %r2,4(%r6) # initialize CCW data addresses195195+ la %r2,0x50(%r2)196196+ la %r6,8(%r6)197197+ bct 7,.Linit198198199199- lctl %c6,%c6,.Lcr6 # set IO subclass mask200200- slr %r2,%r2199199+ lctl %c6,%c6,.Lcr6 # set IO subclass mask200200+ slr %r2,%r2201201.Lldlp:202202- ssch 0(%r3) # load chunk of 1600 bytes203203- bnz .Llderr202202+ ssch 0(%r3) # load chunk of 1600 bytes203203+ bnz .Llderr204204.Lwait4irq:205205- mvc 0x78(8),.Lnewpsw # set up IO interrupt psw206206- lpsw .Lwaitpsw 205205+ mvc 0x78(8),.Lnewpsw # set up IO interrupt psw206206+ lpsw .Lwaitpsw207207.Lioint:208208- c %r1,0xb8 # compare subchannel number209209- bne .Lwait4irq210210- tsch 0(%r5)208208+ c %r1,0xb8 # compare subchannel number209209+ bne .Lwait4irq210210+ tsch 0(%r5)211211212212- slr %r0,%r0213213- ic %r0,8(%r5) # get device status214214- chi %r0,8 # channel end ?215215- be .Lcont216216- chi %r0,12 # channel end + device end ?217217- be .Lcont212212+ slr %r0,%r0213213+ ic %r0,8(%r5) # get device status214214+ chi %r0,8 # channel end ?215215+ be .Lcont216216+ chi %r0,12 # channel end + device end ?217217+ be .Lcont218218219219- l %r0,4(%r5)220220- s %r0,8(%r3) # r0/8 = number of ccws executed221221- mhi %r0,10 # *10 = number of bytes in ccws222222- lh %r3,10(%r5) # get residual count223223- sr %r0,%r3 # #ccws*80-residual=#bytes read224224- ar %r2,%r0225225-226226- br %r14 # r2 contains the total size219219+ l %r0,4(%r5)220220+ s %r0,8(%r3) # r0/8 = number of ccws executed221221+ mhi %r0,10 # *10 = number of bytes in ccws222222+ lh %r3,10(%r5) # get residual count223223+ sr %r0,%r3 # #ccws*80-residual=#bytes read224224+ ar %r2,%r0225225+226226+ br %r14 # r2 contains the total size227227228228.Lcont:229229- ahi %r2,0x640 # add 0x640 to total size230230- la %r6,.Lccws 231231- la %r7,20229229+ ahi %r2,0x640 # add 0x640 to total size230230+ la %r6,.Lccws231231+ la %r7,20232232.Lincr:233233- l %r0,4(%r6) # update CCW data addresses234234- ahi %r0,0x640235235- st %r0,4(%r6)236236- ahi %r6,8237237- bct 7,.Lincr233233+ l %r0,4(%r6) # update CCW data addresses234234+ ahi %r0,0x640235235+ st %r0,4(%r6)236236+ ahi %r6,8237237+ bct 7,.Lincr238238239239- b .Lldlp239239+ b .Lldlp240240.Llderr:241241- lpsw .Lcrash 241241+ lpsw .Lcrash242242243243- .align 8244244-.Lorb: .long 0x00000000,0x0080ff00,.Lccws245245-.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0246246-.Lcr6: .long 0xff000000247247-.Lloadp:.long 0,0248248- .align 8249249-.Lcrash:.long 0x000a0000,0x00000000243243+ .align 8244244+.Lorb: .long 0x00000000,0x0080ff00,.Lccws245245+.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0246246+.Lcr6: .long 0xff000000247247+.Lloadp:.long 0,0248248+ .align 8249249+.Lcrash:.long 0x000a0000,0x00000000250250.Lnewpsw:251251- .long 0x00080000,0x80000000+.Lioint251251+ .long 0x00080000,0x80000000+.Lioint252252.Lwaitpsw:253253- .long 0x020a0000,0x80000000+.Lioint253253+ .long 0x020a0000,0x80000000+.Lioint254254255255- .align 8256256-.Lccws: .rept 19257257- .long 0x02600050,0x00000000258258- .endr259259- .long 0x02200050,0x00000000260260-#endif /* CONFIG_IPL_VM */255255+ .align 8256256+.Lccws: .rept 19257257+ .long 0x02600050,0x00000000258258+ .endr259259+ .long 0x02200050,0x00000000260260+#endif /* CONFIG_IPL_VM */261261262262iplstart:263263- lh %r1,0xb8 # test if subchannel number264264- bct %r1,.Lnoload # is valid265265- l %r1,0xb8 # load ipl subchannel number266266- la %r2,IPL_BS # load start address267267- bas %r14,.Lloader # load rest of ipl image268268- l %r12,.Lparm # pointer to parameter area269269- st %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number263263+ lh %r1,0xb8 # test if subchannel number264264+ bct %r1,.Lnoload # is valid265265+ l %r1,0xb8 # load ipl subchannel number266266+ la %r2,IPL_BS # load start address267267+ bas %r14,.Lloader # load rest of ipl image268268+ l %r12,.Lparm # pointer to parameter area269269+ st %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number270270271271#272272# load parameter file from ipl device273273#274274.Lagain1:275275- l %r2,.Linitrd # ramdisk loc. is temp276276- bas %r14,.Lloader # load parameter file277277- ltr %r2,%r2 # got anything ?278278- bz .Lnopf279279- chi %r2,895280280- bnh .Lnotrunc281281- la %r2,895275275+ l %r2,.Linitrd # ramdisk loc. is temp276276+ bas %r14,.Lloader # load parameter file277277+ ltr %r2,%r2 # got anything ?278278+ bz .Lnopf279279+ chi %r2,895280280+ bnh .Lnotrunc281281+ la %r2,895282282.Lnotrunc:283283- l %r4,.Linitrd284284- clc 0(3,%r4),.L_hdr # if it is HDRx285285- bz .Lagain1 # skip dataset header286286- clc 0(3,%r4),.L_eof # if it is EOFx287287- bz .Lagain1 # skip dateset trailer288288- la %r5,0(%r4,%r2)289289- lr %r3,%r2283283+ l %r4,.Linitrd284284+ clc 0(3,%r4),.L_hdr # if it is HDRx285285+ bz .Lagain1 # skip dataset header286286+ clc 0(3,%r4),.L_eof # if it is EOFx287287+ bz .Lagain1 # skip dateset trailer288288+ la %r5,0(%r4,%r2)289289+ lr %r3,%r2290290.Lidebc:291291- tm 0(%r5),0x80 # high order bit set ?292292- bo .Ldocv # yes -> convert from EBCDIC293293- ahi %r5,-1294294- bct %r3,.Lidebc295295- b .Lnocv291291+ tm 0(%r5),0x80 # high order bit set ?292292+ bo .Ldocv # yes -> convert from EBCDIC293293+ ahi %r5,-1294294+ bct %r3,.Lidebc295295+ b .Lnocv296296.Ldocv:297297- l %r3,.Lcvtab298298- tr 0(256,%r4),0(%r3) # convert parameters to ascii299299- tr 256(256,%r4),0(%r3)300300- tr 512(256,%r4),0(%r3)301301- tr 768(122,%r4),0(%r3)302302-.Lnocv: la %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line303303- mvc 0(256,%r3),0(%r4)304304- mvc 256(256,%r3),256(%r4)305305- mvc 512(256,%r3),512(%r4)306306- mvc 768(122,%r3),768(%r4)307307- slr %r0,%r0308308- b .Lcntlp297297+ l %r3,.Lcvtab298298+ tr 0(256,%r4),0(%r3) # convert parameters to ascii299299+ tr 256(256,%r4),0(%r3)300300+ tr 512(256,%r4),0(%r3)301301+ tr 768(122,%r4),0(%r3)302302+.Lnocv: la %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line303303+ mvc 0(256,%r3),0(%r4)304304+ mvc 256(256,%r3),256(%r4)305305+ mvc 512(256,%r3),512(%r4)306306+ mvc 768(122,%r3),768(%r4)307307+ slr %r0,%r0308308+ b .Lcntlp309309.Ldelspc:310310- ic %r0,0(%r2,%r3)311311- chi %r0,0x20 # is it a space ?312312- be .Lcntlp313313- ahi %r2,1314314- b .Leolp310310+ ic %r0,0(%r2,%r3)311311+ chi %r0,0x20 # is it a space ?312312+ be .Lcntlp313313+ ahi %r2,1314314+ b .Leolp315315.Lcntlp:316316- brct %r2,.Ldelspc316316+ brct %r2,.Ldelspc317317.Leolp:318318- slr %r0,%r0319319- stc %r0,0(%r2,%r3) # terminate buffer318318+ slr %r0,%r0319319+ stc %r0,0(%r2,%r3) # terminate buffer320320.Lnopf:321321322322#323323# load ramdisk from ipl device324324-# 324324+#325325.Lagain2:326326- l %r2,.Linitrd # addr of ramdisk327327- st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)328328- bas %r14,.Lloader # load ramdisk329329- st %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of ramdisk330330- ltr %r2,%r2331331- bnz .Lrdcont332332- st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found326326+ l %r2,.Linitrd # addr of ramdisk327327+ st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)328328+ bas %r14,.Lloader # load ramdisk329329+ st %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd330330+ ltr %r2,%r2331331+ bnz .Lrdcont332332+ st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found333333.Lrdcont:334334- l %r2,.Linitrd334334+ l %r2,.Linitrd335335336336- clc 0(3,%r2),.L_hdr # skip HDRx and EOFx 337337- bz .Lagain2338338- clc 0(3,%r2),.L_eof339339- bz .Lagain2336336+ clc 0(3,%r2),.L_hdr # skip HDRx and EOFx337337+ bz .Lagain2338338+ clc 0(3,%r2),.L_eof339339+ bz .Lagain2340340341341#ifdef CONFIG_IPL_VM342342#343343# reset files in VM reader344344#345345- stidp __LC_CPUID # store cpuid346346- tm __LC_CPUID,0xff # running VM ?347347- bno .Lnoreset348348- la %r2,.Lreset 349349- lhi %r3,26350350- diag %r2,%r3,8351351- la %r5,.Lirb352352- stsch 0(%r5) # check if irq is pending353353- tm 30(%r5),0x0f # by verifying if any of the354354- bnz .Lwaitforirq # activity or status control355355- tm 31(%r5),0xff # bits is set in the schib356356- bz .Lnoreset345345+ stidp __LC_CPUID # store cpuid346346+ tm __LC_CPUID,0xff # running VM ?347347+ bno .Lnoreset348348+ la %r2,.Lreset349349+ lhi %r3,26350350+ diag %r2,%r3,8351351+ la %r5,.Lirb352352+ stsch 0(%r5) # check if irq is pending353353+ tm 30(%r5),0x0f # by verifying if any of the354354+ bnz .Lwaitforirq # activity or status control355355+ tm 31(%r5),0xff # bits is set in the schib356356+ bz .Lnoreset357357.Lwaitforirq:358358- mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw358358+ mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw359359.Lwaitrdrirq:360360- lpsw .Lrdrwaitpsw360360+ lpsw .Lrdrwaitpsw361361.Lrdrint:362362- c %r1,0xb8 # compare subchannel number363363- bne .Lwaitrdrirq364364- la %r5,.Lirb365365- tsch 0(%r5)362362+ c %r1,0xb8 # compare subchannel number363363+ bne .Lwaitrdrirq364364+ la %r5,.Lirb365365+ tsch 0(%r5)366366.Lnoreset:367367- b .Lnoload367367+ b .Lnoload368368369369- .align 8369369+ .align 8370370.Lrdrnewpsw:371371- .long 0x00080000,0x80000000+.Lrdrint371371+ .long 0x00080000,0x80000000+.Lrdrint372372.Lrdrwaitpsw:373373- .long 0x020a0000,0x80000000+.Lrdrint373373+ .long 0x020a0000,0x80000000+.Lrdrint374374#endif375375376376#377377# everything loaded, go for it378378#379379.Lnoload:380380- l %r1,.Lstartup381381- br %r1380380+ l %r1,.Lstartup381381+ br %r1382382383383-.Linitrd:.long _end + 0x400000 # default address of initrd383383+.Linitrd:.long _end + 0x400000 # default address of initrd384384.Lparm: .long PARMAREA385385.Lstartup: .long startup386386-.Lcvtab:.long _ebcasc # ebcdic to ascii table387387-.Lreset:.byte 0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40388388- .byte 0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6389389- .byte 0xc8,0xd6,0xd3,0xc4 # "change rdr all keep nohold"390390-.L_eof: .long 0xc5d6c600 /* C'EOF' */391391-.L_hdr: .long 0xc8c4d900 /* C'HDR' */386386+.Lcvtab:.long _ebcasc # ebcdic to ascii table387387+.Lreset:.byte 0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40388388+ .byte 0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6389389+ .byte 0xc8,0xd6,0xd3,0xc4 # "change rdr all keep nohold"390390+.L_eof: .long 0xc5d6c600 /* C'EOF' */391391+.L_hdr: .long 0xc8c4d900 /* C'HDR' */392392393393-#endif /* CONFIG_IPL */393393+#endif /* CONFIG_IPL */394394395395#396396# SALIPL loader support. Based on a patch by Rob van der Heij.397397# This entry point is called directly from the SALIPL loader and398398# doesn't need a builtin ipl record.399399#400400- .org 0x800401401- .globl start400400+ .org 0x800401401+ .globl start402402start:403403- stm %r0,%r15,0x07b0 # store registers404404- basr %r12,%r0403403+ stm %r0,%r15,0x07b0 # store registers404404+ basr %r12,%r0405405.base:406406- l %r11,.parm407407- l %r8,.cmd # pointer to command buffer406406+ l %r11,.parm407407+ l %r8,.cmd # pointer to command buffer408408409409- ltr %r9,%r9 # do we have SALIPL parameters?410410- bp .sk8x8409409+ ltr %r9,%r9 # do we have SALIPL parameters?410410+ bp .sk8x8411411412412- mvc 0(64,%r8),0x00b0 # copy saved registers413413- xc 64(240-64,%r8),0(%r8) # remainder of buffer414414- tr 0(64,%r8),.lowcase 415415- b .gotr412412+ mvc 0(64,%r8),0x00b0 # copy saved registers413413+ xc 64(240-64,%r8),0(%r8) # remainder of buffer414414+ tr 0(64,%r8),.lowcase415415+ b .gotr416416.sk8x8:417417- mvc 0(240,%r8),0(%r9) # copy iplparms into buffer417417+ mvc 0(240,%r8),0(%r9) # copy iplparms into buffer418418.gotr:419419- l %r10,.tbl # EBCDIC to ASCII table420420- tr 0(240,%r8),0(%r10)421421- stidp __LC_CPUID # Are we running on VM maybe422422- cli __LC_CPUID,0xff423423- bnz .test424424- .long 0x83300060 # diag 3,0,x'0060' - storage size425425- b .done419419+ l %r10,.tbl # EBCDIC to ASCII table420420+ tr 0(240,%r8),0(%r10)421421+ stidp __LC_CPUID # Are we running on VM maybe422422+ cli __LC_CPUID,0xff423423+ bnz .test424424+ .long 0x83300060 # diag 3,0,x'0060' - storage size425425+ b .done426426.test:427427- mvc 0x68(8),.pgmnw # set up pgm check handler428428- l %r2,.fourmeg429429- lr %r3,%r2430430- bctr %r3,%r0 # 4M-1431431-.loop: iske %r0,%r3432432- ar %r3,%r2427427+ mvc 0x68(8),.pgmnw # set up pgm check handler428428+ l %r2,.fourmeg429429+ lr %r3,%r2430430+ bctr %r3,%r0 # 4M-1431431+.loop: iske %r0,%r3432432+ ar %r3,%r2433433.pgmx:434434- sr %r3,%r2435435- la %r3,1(%r3)434434+ sr %r3,%r2435435+ la %r3,1(%r3)436436.done:437437- l %r1,.memsize438438- st %r3,ARCH_OFFSET(%r1)439439- slr %r0,%r0440440- st %r0,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r11)441441- st %r0,INITRD_START+ARCH_OFFSET-PARMAREA(%r11)442442- j startup # continue with startup443443-.tbl: .long _ebcasc # translate table444444-.cmd: .long COMMAND_LINE # address of command line buffer445445-.parm: .long PARMAREA437437+ l %r1,.memsize438438+ st %r3,ARCH_OFFSET(%r1)439439+ slr %r0,%r0440440+ st %r0,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r11)441441+ st %r0,INITRD_START+ARCH_OFFSET-PARMAREA(%r11)442442+ j startup # continue with startup443443+.tbl: .long _ebcasc # translate table444444+.cmd: .long COMMAND_LINE # address of command line buffer445445+.parm: .long PARMAREA446446.memsize: .long memory_size447447.fourmeg: .long 0x00400000 # 4M448448-.pgmnw: .long 0x00080000,.pgmx448448+.pgmnw: .long 0x00080000,.pgmx449449.lowcase:450450- .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 450450+ .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07451451 .byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f452452- .byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 452452+ .byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17453453 .byte 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f454454- .byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 454454+ .byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27455455 .byte 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f456456- .byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37 456456+ .byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37457457 .byte 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f458458- .byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47 458458+ .byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47459459 .byte 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f460460- .byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57 460460+ .byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57461461 .byte 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f462462- .byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67 462462+ .byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67463463 .byte 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f464464- .byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77 464464+ .byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77465465 .byte 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f466466467467- .byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87 467467+ .byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87468468 .byte 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f469469- .byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97 469469+ .byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97470470 .byte 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f471471- .byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7 471471+ .byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7472472 .byte 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf473473- .byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7 473473+ .byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7474474 .byte 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf475475- .byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87 # .abcdefg 475475+ .byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87 # .abcdefg476476 .byte 0x88,0x89,0xca,0xcb,0xcc,0xcd,0xce,0xcf # hi477477- .byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97 # .jklmnop477477+ .byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97 # .jklmnop478478 .byte 0x98,0x99,0xda,0xdb,0xdc,0xdd,0xde,0xdf # qr479479 .byte 0xe0,0xe1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7 # ..stuvwx480480 .byte 0xa8,0xa9,0xea,0xeb,0xec,0xed,0xee,0xef # yz481481- .byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7 481481+ .byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7482482 .byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff483483484484#ifdef CONFIG_64BIT
+216-216
arch/s390/kernel/head64.S
···1515# this is called either by the ipl loader or directly by PSW restart1616# or linload or SALIPL1717#1818- .org 0x100001919-startup:basr %r13,0 # get base2020-.LPG0: l %r13,0f-.LPG0(%r13)2121- b 0(%r13)2222-0: .long startup_continue1818+ .org 0x100001919+startup:basr %r13,0 # get base2020+.LPG0: l %r13,0f-.LPG0(%r13)2121+ b 0(%r13)2222+0: .long startup_continue23232424#2525# params at 10400 (setup.h)2626#2727- .org PARMAREA2828- .quad 0 # IPL_DEVICE2929- .quad 0 # INITRD_START3030- .quad 0 # INITRD_SIZE2727+ .org PARMAREA2828+ .quad 0 # IPL_DEVICE2929+ .quad 0 # INITRD_START3030+ .quad 0 # INITRD_SIZE31313232- .org COMMAND_LINE3333- .byte "root=/dev/ram0 ro"3434- .byte 03232+ .org COMMAND_LINE3333+ .byte "root=/dev/ram0 ro"3434+ .byte 035353636- .org 0x110003636+ .org 0x1100037373838startup_continue:3939- basr %r13,0 # get base4040-.LPG1: sll %r13,1 # remove high order bit4141- srl %r13,14242- lhi %r1,1 # mode 1 = esame4343- mvi __LC_AR_MODE_ID,1 # set esame flag4444- slr %r0,%r0 # set cpuid to zero4545- sigp %r1,%r0,0x12 # switch to esame mode4646- sam64 # switch to 64 bit mode4747- lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers4848- lg %r12,.Lparmaddr-.LPG1(%r13)# pointer to parameter area4949- # move IPL device to lowcore5050- mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12)3939+ basr %r13,0 # get base4040+.LPG1: sll %r13,1 # remove high order bit4141+ srl %r13,14242+ lhi %r1,1 # mode 1 = esame4343+ mvi __LC_AR_MODE_ID,1 # set esame flag4444+ slr %r0,%r0 # set cpuid to zero4545+ sigp %r1,%r0,0x12 # switch to esame mode4646+ sam64 # switch to 64 bit mode4747+ lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers4848+ lg %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area4949+ # move IPL device to lowcore5050+ mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12)5151#5252# Setup stack5353#5454- larl %r15,init_thread_union5555- lg %r14,__TI_task(%r15) # cache current in lowcore5656- stg %r14,__LC_CURRENT5757- aghi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union + THREAD_SIZE5858- stg %r15,__LC_KERNEL_STACK # set end of kernel stack5959- aghi %r15,-1606060- xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain5454+ larl %r15,init_thread_union5555+ lg %r14,__TI_task(%r15) # cache current in lowcore5656+ stg %r14,__LC_CURRENT5757+ aghi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union + THREAD_SIZE5858+ stg %r15,__LC_KERNEL_STACK # set end of kernel stack5959+ aghi %r15,-1606060+ xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain61616262- brasl %r14,ipl_save_parameters6262+ brasl %r14,ipl_save_parameters6363#6464# clear bss memory6565#6666- larl %r2,__bss_start # start of bss segment6767- larl %r3,_end # end of bss segment6868- sgr %r3,%r2 # length of bss6969- sgr %r4,%r4 #7070- sgr %r5,%r5 # set src,length and pad to zero7171- mvcle %r2,%r4,0 # clear mem7272- jo .-4 # branch back, if not finish6666+ larl %r2,__bss_start # start of bss segment6767+ larl %r3,_end # end of bss segment6868+ sgr %r3,%r2 # length of bss6969+ sgr %r4,%r4 #7070+ sgr %r5,%r5 # set src,length and pad to zero7171+ mvcle %r2,%r4,0 # clear mem7272+ jo .-4 # branch back, if not finish73737474- l %r2,.Lrcp-.LPG1(%r13) # Read SCP forced command word7474+ l %r2,.Lrcp-.LPG1(%r13) # Read SCP forced command word7575.Lservicecall:7676- stosm .Lpmask-.LPG1(%r13),0x01 # authorize ext interrupts7676+ stosm .Lpmask-.LPG1(%r13),0x01 # authorize ext interrupts77777878- stctg %r0,%r0,.Lcr-.LPG1(%r13) # get cr07979- la %r1,0x200 # set bit 228080- og %r1,.Lcr-.LPG1(%r13) # or old cr0 with r18181- stg %r1,.Lcr-.LPG1(%r13)8282- lctlg %r0,%r0,.Lcr-.LPG1(%r13) # load modified cr07878+ stctg %r0,%r0,.Lcr-.LPG1(%r13) # get cr07979+ la %r1,0x200 # set bit 228080+ og %r1,.Lcr-.LPG1(%r13) # or old cr0 with r18181+ stg %r1,.Lcr-.LPG1(%r13)8282+ lctlg %r0,%r0,.Lcr-.LPG1(%r13) # load modified cr083838484- mvc __LC_EXT_NEW_PSW(8),.Lpcmsk-.LPG1(%r13) # set postcall psw8585- larl %r1,.Lsclph8686- stg %r1,__LC_EXT_NEW_PSW+8 # set handler8484+ mvc __LC_EXT_NEW_PSW(8),.Lpcmsk-.LPG1(%r13) # set postcall psw8585+ larl %r1,.Lsclph8686+ stg %r1,__LC_EXT_NEW_PSW+8 # set handler87878888- larl %r4,.Lsccb # %r4 is our index for sccb stuff8989- lgr %r1,%r4 # our sccb9090- .insn rre,0xb2200000,%r2,%r1 # service call9191- ipm %r19292- srl %r1,28 # get cc code9393- xr %r3,%r39494- chi %r1,39595- be .Lfchunk-.LPG1(%r13) # leave9696- chi %r1,29797- be .Lservicecall-.LPG1(%r13)9898- lpswe .Lwaitsclp-.LPG1(%r13)8888+ larl %r4,.Lsccb # %r4 is our index for sccb stuff8989+ lgr %r1,%r4 # our sccb9090+ .insn rre,0xb2200000,%r2,%r1 # service call9191+ ipm %r19292+ srl %r1,28 # get cc code9393+ xr %r3,%r39494+ chi %r1,39595+ be .Lfchunk-.LPG1(%r13) # leave9696+ chi %r1,29797+ be .Lservicecall-.LPG1(%r13)9898+ lpswe .Lwaitsclp-.LPG1(%r13)9999.Lsclph:100100- lh %r1,.Lsccbr-.Lsccb(%r4)101101- chi %r1,0x10 # 0x0010 is the sucess code102102- je .Lprocsccb # let's process the sccb103103- chi %r1,0x1f0104104- bne .Lfchunk-.LPG1(%r13) # unhandled error code105105- c %r2,.Lrcp-.LPG1(%r13) # Did we try Read SCP forced106106- bne .Lfchunk-.LPG1(%r13) # if no, give up107107- l %r2,.Lrcp2-.LPG1(%r13) # try with Read SCP108108- b .Lservicecall-.LPG1(%r13)100100+ lh %r1,.Lsccbr-.Lsccb(%r4)101101+ chi %r1,0x10 # 0x0010 is the sucess code102102+ je .Lprocsccb # let's process the sccb103103+ chi %r1,0x1f0104104+ bne .Lfchunk-.LPG1(%r13) # unhandled error code105105+ c %r2,.Lrcp-.LPG1(%r13) # Did we try Read SCP forced106106+ bne .Lfchunk-.LPG1(%r13) # if no, give up107107+ l %r2,.Lrcp2-.LPG1(%r13) # try with Read SCP108108+ b .Lservicecall-.LPG1(%r13)109109.Lprocsccb:110110- lghi %r1,0111111- icm %r1,3,.Lscpincr1-.Lsccb(%r4) # use this one if != 0112112- jnz .Lscnd113113- lg %r1,.Lscpincr2-.Lsccb(%r4) # otherwise use this one110110+ lghi %r1,0111111+ icm %r1,3,.Lscpincr1-.Lsccb(%r4) # use this one if != 0112112+ jnz .Lscnd113113+ lg %r1,.Lscpincr2-.Lsccb(%r4) # otherwise use this one114114.Lscnd:115115- xr %r3,%r3 # same logic116116- ic %r3,.Lscpa1-.Lsccb(%r4)117117- chi %r3,0x00118118- jne .Lcompmem119119- l %r3,.Lscpa2-.Lsccb(%r4)115115+ xr %r3,%r3 # same logic116116+ ic %r3,.Lscpa1-.Lsccb(%r4)117117+ chi %r3,0x00118118+ jne .Lcompmem119119+ l %r3,.Lscpa2-.Lsccb(%r4)120120.Lcompmem:121121- mlgr %r2,%r1 # mem in MB on 128-bit122122- l %r1,.Lonemb-.LPG1(%r13)123123- mlgr %r2,%r1 # mem size in bytes in %r3124124- b .Lfchunk-.LPG1(%r13)121121+ mlgr %r2,%r1 # mem in MB on 128-bit122122+ l %r1,.Lonemb-.LPG1(%r13)123123+ mlgr %r2,%r1 # mem size in bytes in %r3124124+ b .Lfchunk-.LPG1(%r13)125125126126- .align 4126126+ .align 4127127.Lpmask:128128- .byte 0129129- .align 8128128+ .byte 0129129+ .align 8130130.Lcr:131131- .quad 0x00 # place holder for cr0131131+ .quad 0x00 # place holder for cr0132132.Lwaitsclp:133133- .quad 0x0102000180000000,.Lsclph133133+ .quad 0x0102000180000000,.Lsclph134134.Lrcp:135135- .int 0x00120001 # Read SCP forced code135135+ .int 0x00120001 # Read SCP forced code136136.Lrcp2:137137- .int 0x00020001 # Read SCP code137137+ .int 0x00020001 # Read SCP code138138.Lonemb:139139- .int 0x100000139139+ .int 0x100000140140141141.Lfchunk:142142- # set program check new psw mask143143- mvc __LC_PGM_NEW_PSW(8),.Lpcmsk-.LPG1(%r13)142142+ # set program check new psw mask143143+ mvc __LC_PGM_NEW_PSW(8),.Lpcmsk-.LPG1(%r13)144144145145#146146# find memory chunks.147147#148148- lgr %r9,%r3 # end of mem149149- larl %r1,.Lchkmem # set program check address150150- stg %r1,__LC_PGM_NEW_PSW+8151151- la %r1,1 # test in increments of 128KB152152- sllg %r1,%r1,17153153- larl %r3,memory_chunk154154- slgr %r4,%r4 # set start of chunk to zero155155- slgr %r5,%r5 # set end of chunk to zero156156- slr %r6,%r6 # set access code to zero157157- la %r10,MEMORY_CHUNKS # number of chunks148148+ lgr %r9,%r3 # end of mem149149+ larl %r1,.Lchkmem # set program check address150150+ stg %r1,__LC_PGM_NEW_PSW+8151151+ la %r1,1 # test in increments of 128KB152152+ sllg %r1,%r1,17153153+ larl %r3,memory_chunk154154+ slgr %r4,%r4 # set start of chunk to zero155155+ slgr %r5,%r5 # set end of chunk to zero156156+ slr %r6,%r6 # set access code to zero157157+ la %r10,MEMORY_CHUNKS # number of chunks158158.Lloop:159159- tprot 0(%r5),0 # test protection of first byte160160- ipm %r7161161- srl %r7,28162162- clr %r6,%r7 # compare cc with last access code163163- je .Lsame164164- j .Lchkmem159159+ tprot 0(%r5),0 # test protection of first byte160160+ ipm %r7161161+ srl %r7,28162162+ clr %r6,%r7 # compare cc with last access code163163+ je .Lsame164164+ j .Lchkmem165165.Lsame:166166- algr %r5,%r1 # add 128KB to end of chunk167167- # no need to check here,168168- brc 12,.Lloop # this is the same chunk169169-.Lchkmem: # > 16EB or tprot got a program check170170- clgr %r4,%r5 # chunk size > 0?171171- je .Lchkloop172172- stg %r4,0(%r3) # store start address of chunk173173- lgr %r0,%r5174174- slgr %r0,%r4175175- stg %r0,8(%r3) # store size of chunk176176- st %r6,20(%r3) # store type of chunk177177- la %r3,24(%r3)178178- larl %r8,memory_size179179- stg %r5,0(%r8) # store memory size180180- ahi %r10,-1 # update chunk number166166+ algr %r5,%r1 # add 128KB to end of chunk167167+ # no need to check here,168168+ brc 12,.Lloop # this is the same chunk169169+.Lchkmem: # > 16EB or tprot got a program check170170+ clgr %r4,%r5 # chunk size > 0?171171+ je .Lchkloop172172+ stg %r4,0(%r3) # store start address of chunk173173+ lgr %r0,%r5174174+ slgr %r0,%r4175175+ stg %r0,8(%r3) # store size of chunk176176+ st %r6,20(%r3) # store type of chunk177177+ la %r3,24(%r3)178178+ larl %r8,memory_size179179+ stg %r5,0(%r8) # store memory size180180+ ahi %r10,-1 # update chunk number181181.Lchkloop:182182- lr %r6,%r7 # set access code to last cc182182+ lr %r6,%r7 # set access code to last cc183183 # we got an exception or we're starting a new184184 # chunk , we must check if we should185185 # still try to find valid memory (if we detected186186 # the amount of available storage), and if we187187 # have chunks left188188- lghi %r4,1189189- sllg %r4,%r4,31190190- clgr %r5,%r4191191- je .Lhsaskip192192- xr %r0, %r0193193- clgr %r0, %r9 # did we detect memory?194194- je .Ldonemem # if not, leave195195- chi %r10, 0 # do we have chunks left?196196- je .Ldonemem188188+ lghi %r4,1189189+ sllg %r4,%r4,31190190+ clgr %r5,%r4191191+ je .Lhsaskip192192+ xr %r0, %r0193193+ clgr %r0, %r9 # did we detect memory?194194+ je .Ldonemem # if not, leave195195+ chi %r10, 0 # do we have chunks left?196196+ je .Ldonemem197197.Lhsaskip:198198- algr %r5,%r1 # add 128KB to end of chunk199199- lgr %r4,%r5 # potential new chunk200200- clgr %r5,%r9 # should we go on?201201- jl .Lloop202202-.Ldonemem: 198198+ algr %r5,%r1 # add 128KB to end of chunk199199+ lgr %r4,%r5 # potential new chunk200200+ clgr %r5,%r9 # should we go on?201201+ jl .Lloop202202+.Ldonemem:203203204204- larl %r12,machine_flags204204+ larl %r12,machine_flags205205#206206# find out if we are running under VM207207#208208- stidp __LC_CPUID # store cpuid209209- tm __LC_CPUID,0xff # running under VM ?210210- bno 0f-.LPG1(%r13)211211- oi 7(%r12),1 # set VM flag212212-0: lh %r0,__LC_CPUID+4 # get cpu version213213- chi %r0,0x7490 # running on a P/390 ?214214- bne 1f-.LPG1(%r13)215215- oi 7(%r12),4 # set P/390 flag208208+ stidp __LC_CPUID # store cpuid209209+ tm __LC_CPUID,0xff # running under VM ?210210+ bno 0f-.LPG1(%r13)211211+ oi 7(%r12),1 # set VM flag212212+0: lh %r0,__LC_CPUID+4 # get cpu version213213+ chi %r0,0x7490 # running on a P/390 ?214214+ bne 1f-.LPG1(%r13)215215+ oi 7(%r12),4 # set P/390 flag2162161:217217218218#219219# find out if we have the MVPG instruction220220#221221- la %r1,0f-.LPG1(%r13) # set program check address222222- stg %r1,__LC_PGM_NEW_PSW+8223223- sgr %r0,%r0224224- lghi %r1,0225225- lghi %r2,0226226- mvpg %r1,%r2 # test MVPG instruction227227- oi 7(%r12),16 # set MVPG flag221221+ la %r1,0f-.LPG1(%r13) # set program check address222222+ stg %r1,__LC_PGM_NEW_PSW+8223223+ sgr %r0,%r0224224+ lghi %r1,0225225+ lghi %r2,0226226+ mvpg %r1,%r2 # test MVPG instruction227227+ oi 7(%r12),16 # set MVPG flag2282280:229229230230#231231# find out if the diag 0x44 works in 64 bit mode232232#233233- la %r1,0f-.LPG1(%r13) # set program check address234234- stg %r1,__LC_PGM_NEW_PSW+8235235- diag 0,0,0x44 # test diag 0x44236236- oi 7(%r12),32 # set diag44 flag237237-0: 233233+ la %r1,0f-.LPG1(%r13) # set program check address234234+ stg %r1,__LC_PGM_NEW_PSW+8235235+ diag 0,0,0x44 # test diag 0x44236236+ oi 7(%r12),32 # set diag44 flag237237+0:238238239239#240240# find out if we have the IDTE instruction241241#242242- la %r1,0f-.LPG1(%r13) # set program check address243243- stg %r1,__LC_PGM_NEW_PSW+8242242+ la %r1,0f-.LPG1(%r13) # set program check address243243+ stg %r1,__LC_PGM_NEW_PSW+8244244 .long 0xb2b10000 # store facility list245245 tm 0xc8,0x08 # check bit for clearing-by-ASCE246246 bno 0f-.LPG1(%r13)···263263 oi 6(%r12),2 # set MVCOS flag2642641:265265266266- lpswe .Lentry-.LPG1(13) # jump to _stext in primary-space,267267- # virtual and never return ...268268- .align 16269269-.Lentry:.quad 0x0000000180000000,_stext270270-.Lctl: .quad 0x04b50002 # cr0: various things271271- .quad 0 # cr1: primary space segment table272272- .quad .Lduct # cr2: dispatchable unit control table273273- .quad 0 # cr3: instruction authorization274274- .quad 0 # cr4: instruction authorization275275- .quad 0xffffffffffffffff # cr5: primary-aste origin276276- .quad 0 # cr6: I/O interrupts277277- .quad 0 # cr7: secondary space segment table278278- .quad 0 # cr8: access registers translation279279- .quad 0 # cr9: tracing off280280- .quad 0 # cr10: tracing off281281- .quad 0 # cr11: tracing off282282- .quad 0 # cr12: tracing off283283- .quad 0 # cr13: home space segment table284284- .quad 0xc0000000 # cr14: machine check handling off285285- .quad 0 # cr15: linkage stack operations286286-.Lduct: .long 0,0,0,0,0,0,0,0287287- .long 0,0,0,0,0,0,0,0288288-.Lpcmsk:.quad 0x0000000180000000266266+ lpswe .Lentry-.LPG1(13) # jump to _stext in primary-space,267267+ # virtual and never return ...268268+ .align 16269269+.Lentry:.quad 0x0000000180000000,_stext270270+.Lctl: .quad 0x04b50002 # cr0: various things271271+ .quad 0 # cr1: primary space segment table272272+ .quad .Lduct # cr2: dispatchable unit control table273273+ .quad 0 # cr3: instruction authorization274274+ .quad 0 # cr4: instruction authorization275275+ .quad 0xffffffffffffffff # cr5: primary-aste origin276276+ .quad 0 # cr6: I/O interrupts277277+ .quad 0 # cr7: secondary space segment table278278+ .quad 0 # cr8: access registers translation279279+ .quad 0 # cr9: tracing off280280+ .quad 0 # cr10: tracing off281281+ .quad 0 # cr11: tracing off282282+ .quad 0 # cr12: tracing off283283+ .quad 0 # cr13: home space segment table284284+ .quad 0xc0000000 # cr14: machine check handling off285285+ .quad 0 # cr15: linkage stack operations286286+.Lduct: .long 0,0,0,0,0,0,0,0287287+ .long 0,0,0,0,0,0,0,0288288+.Lpcmsk:.quad 0x0000000180000000289289.L4malign:.quad 0xffffffffffc00000290290-.Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8291291-.Lnop: .long 0x07000700290290+.Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8291291+.Lnop: .long 0x07000700292292.Lparmaddr:293293 .quad PARMAREA294294295295- .globl ipl_schib295295+ .globl ipl_schib296296ipl_schib:297297 .rept 13298298 .long 0299299 .endr300300301301- .globl ipl_flags301301+ .globl ipl_flags302302ipl_flags:303303- .long 0304304- .globl ipl_devno303303+ .long 0304304+ .globl ipl_devno305305ipl_devno:306306 .word 0307307···309309.globl s390_readinfo_sccb310310s390_readinfo_sccb:311311.Lsccb:312312- .hword 0x1000 # length, one page313313- .byte 0x00,0x00,0x00314314- .byte 0x80 # variable response bit set312312+ .hword 0x1000 # length, one page313313+ .byte 0x00,0x00,0x00314314+ .byte 0x80 # variable response bit set315315.Lsccbr:316316- .hword 0x00 # response code316316+ .hword 0x00 # response code317317.Lscpincr1:318318- .hword 0x00318318+ .hword 0x00319319.Lscpa1:320320- .byte 0x00321321- .fill 89,1,0320320+ .byte 0x00321321+ .fill 89,1,0322322.Lscpa2:323323- .int 0x00323323+ .int 0x00324324.Lscpincr2:325325- .quad 0x00326326- .fill 3984,1,0325325+ .quad 0x00326326+ .fill 3984,1,0327327 .org 0x13000328328329329#ifdef CONFIG_SHARED_KERNEL330330- .org 0x100000330330+ .org 0x100000331331#endif332332-332332+333333#334334# startup-code, running in absolute addressing mode335335#336336- .globl _stext337337-_stext: basr %r13,0 # get base336336+ .globl _stext337337+_stext: basr %r13,0 # get base338338.LPG3:339339# check control registers340340- stctg %c0,%c15,0(%r15)341341- oi 6(%r15),0x40 # enable sigp emergency signal342342- oi 4(%r15),0x10 # switch on low address proctection343343- lctlg %c0,%c15,0(%r15)340340+ stctg %c0,%c15,0(%r15)341341+ oi 6(%r15),0x40 # enable sigp emergency signal342342+ oi 4(%r15),0x10 # switch on low address proctection343343+ lctlg %c0,%c15,0(%r15)344344345345- lam 0,15,.Laregs-.LPG3(%r13) # load access regs needed by uaccess346346- brasl %r14,start_kernel # go to C code345345+ lam 0,15,.Laregs-.LPG3(%r13) # load acrs needed by uaccess346346+ brasl %r14,start_kernel # go to C code347347#348348# We returned from start_kernel ?!? PANIK349349#350350- basr %r13,0351351- lpswe .Ldw-.(%r13) # load disabled wait psw350350+ basr %r13,0351351+ lpswe .Ldw-.(%r13) # load disabled wait psw352352353353- .align 8354354-.Ldw: .quad 0x0002000180000000,0x0000000000000000355355-.Laregs: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0353353+ .align 8354354+.Ldw: .quad 0x0002000180000000,0x0000000000000000355355+.Laregs:.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
···44 * S390 version55 * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation66 * Author(s): Holger Smolinski (Holger.Smolinski@de.ibm.com)77- Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)77+ Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)88 */991010#include <asm/lowcore.h>···3232 stctg %c0,%c0,.Lregsave-.Lpg0(%r13)3333 ni .Lregsave+4-.Lpg0(%r13),0xef3434 lctlg %c0,%c0,.Lregsave-.Lpg0(%r13)3535- lgr %r1,%r23636- mvc __LC_PGM_NEW_PSW(16),.Lpcnew-.Lpg0(%r13)3737- stsch .Lschib-.Lpg0(%r13) 3838- oi .Lschib+5-.Lpg0(%r13),0x84 3939-.Lecs: xi .Lschib+27-.Lpg0(%r13),0x01 4040- msch .Lschib-.Lpg0(%r13) 4141- lghi %r0,54242-.Lssch: ssch .Liplorb-.Lpg0(%r13) 3535+ lgr %r1,%r23636+ mvc __LC_PGM_NEW_PSW(16),.Lpcnew-.Lpg0(%r13)3737+ stsch .Lschib-.Lpg0(%r13)3838+ oi .Lschib+5-.Lpg0(%r13),0x843939+.Lecs: xi .Lschib+27-.Lpg0(%r13),0x014040+ msch .Lschib-.Lpg0(%r13)4141+ lghi %r0,54242+.Lssch: ssch .Liplorb-.Lpg0(%r13)4343 jz .L0014444- brct %r0,.Lssch 4444+ brct %r0,.Lssch4545 bas %r14,.Ldisab-.Lpg0(%r13)4646-.L001: mvc __LC_IO_NEW_PSW(16),.Lionew-.Lpg0(%r13) 4747-.Ltpi: lpswe .Lwaitpsw-.Lpg0(%r13) 4646+.L001: mvc __LC_IO_NEW_PSW(16),.Lionew-.Lpg0(%r13)4747+.Ltpi: lpswe .Lwaitpsw-.Lpg0(%r13)4848.Lcont: c %r1,__LC_SUBCHANNEL_ID4949 jnz .Ltpi5050 clc __LC_IO_INT_PARM(4),.Liplorb-.Lpg0(%r13)5151 jnz .Ltpi5252- tsch .Liplirb-.Lpg0(%r13) 5252+ tsch .Liplirb-.Lpg0(%r13)5353 tm .Liplirb+9-.Lpg0(%r13),0xbf5454- jz .L0025555- bas %r14,.Ldisab-.Lpg0(%r13) 5656-.L002: tm .Liplirb+8-.Lpg0(%r13),0xf3 5757- jz .L0035858- bas %r14,.Ldisab-.Lpg0(%r13) 5454+ jz .L0025555+ bas %r14,.Ldisab-.Lpg0(%r13)5656+.L002: tm .Liplirb+8-.Lpg0(%r13),0xf35757+ jz .L0035858+ bas %r14,.Ldisab-.Lpg0(%r13)5959.L003: spx .Lnull-.Lpg0(%r13)6060- st %r1,__LC_SUBCHANNEL_ID6161- lhi %r1,0 # mode 0 = esa6262- slr %r0,%r0 # set cpuid to zero6363- sigp %r1,%r0,0x12 # switch to esa mode6464- lpsw 06565-.Ldisab: sll %r14,16666- srl %r14,1 # need to kill hi bit to avoid specification exceptions.6767- st %r14,.Ldispsw+12-.Lpg0(%r13)6060+ st %r1,__LC_SUBCHANNEL_ID6161+ lhi %r1,0 # mode 0 = esa6262+ slr %r0,%r0 # set cpuid to zero6363+ sigp %r1,%r0,0x12 # switch to esa mode6464+ lpsw 06565+.Ldisab: sll %r14,16666+ srl %r14,1 # need to kill hi bit to avoid specification exceptions.6767+ st %r14,.Ldispsw+12-.Lpg0(%r13)6868 lpswe .Ldispsw-.Lpg0(%r13)6969- .align 86969+ .align 87070.Lclkcmp: .quad 0x00000000000000007171.Lall: .quad 0x00000000ff0000007272.Lregsave: .quad 0x00000000000000007373-.Lnull: .long 0x00000000000000007474- .align 167373+.Lnull: .long 0x00000000000000007474+ .align 167575/*7676 * These addresses have to be 31 bit otherwise7777 * the sigp will throw a specifcation exception···8181 * 31bit lpswe instruction a fact they appear to have8282 * ommited from the pop.8383 */8484-.Lnewpsw: .quad 0x00000000800000008585- .quad .Lpg18686-.Lpcnew: .quad 0x00000000800000008787- .quad .Lecs8888-.Lionew: .quad 0x00000000800000008989- .quad .Lcont8484+.Lnewpsw: .quad 0x00000000800000008585+ .quad .Lpg18686+.Lpcnew: .quad 0x00000000800000008787+ .quad .Lecs8888+.Lionew: .quad 0x00000000800000008989+ .quad .Lcont9090.Lwaitpsw: .quad 0x02020000800000009191- .quad .Ltpi9292-.Ldispsw: .quad 0x00020000800000009393- .quad 0x00000000000000009494-.Liplccws: .long 0x02000000,0x600000189595- .long 0x08000008,0x200000019191+ .quad .Ltpi9292+.Ldispsw: .quad 0x00020000800000009393+ .quad 0x00000000000000009494+.Liplccws: .long 0x02000000,0x600000189595+ .long 0x08000008,0x200000019696.Liplorb: .long 0x0049504c,0x0040ff809797 .long 0x00000000+.Liplccws9898-.Lschib: .long 0x00000000,0x000000009999- .long 0x00000000,0x00000000100100- .long 0x00000000,0x00000000101101- .long 0x00000000,0x00000000102102- .long 0x00000000,0x00000000103103- .long 0x00000000,0x000000009898+.Lschib: .long 0x00000000,0x000000009999+ .long 0x00000000,0x00000000100100+ .long 0x00000000,0x00000000101101+ .long 0x00000000,0x00000000102102+ .long 0x00000000,0x00000000103103+ .long 0x00000000,0x00000000104104.Liplirb: .long 0x00000000,0x00000000105105 .long 0x00000000,0x00000000106106 .long 0x00000000,0x00000000···109109 .long 0x00000000,0x00000000110110 .long 0x00000000,0x00000000111111 .long 0x00000000,0x00000000112112-
+37-37
arch/s390/kernel/relocate_kernel.S
···33 *44 * (C) Copyright IBM Corp. 200555 *66- * Author(s): Rolf Adelsberger <adelsberger@de.ibm.com>66+ * Author(s): Rolf Adelsberger,77 * Heiko Carstens <heiko.carstens@de.ibm.com>88 *99 */···2424 .text2525 .globl relocate_kernel2626 relocate_kernel:2727- basr %r13,0 #base address2727+ basr %r13,0 # base address2828 .base:2929- stnsm sys_msk-.base(%r13),0xf8 #disable DAT and IRQ (external)3030- spx zero64-.base(%r13) #absolute addressing mode2929+ stnsm sys_msk-.base(%r13),0xf8 # disable DAT and IRQ (external)3030+ spx zero64-.base(%r13) # absolute addressing mode3131 stctl %c0,%c15,ctlregs-.base(%r13)3232 stm %r0,%r15,gprregs-.base(%r13)3333 la %r1,load_psw-.base(%r13)3434- mvc 0(8,%r0),0(%r1)3434+ mvc 0(8,%r0),0(%r1)3535 la %r0,.back-.base(%r13)3636 st %r0,4(%r0)3737 oi 4(%r0),0x80···5151 .back_pgm:5252 lm %r0,%r15,gprregs-.base(%r13)5353 .start_reloc:5454- lhi %r10,-1 #preparing the mask5555- sll %r10,12 #shift it such that it becomes 0xf0005454+ lhi %r10,-1 # preparing the mask5555+ sll %r10,12 # shift it such that it becomes 0xf0005656 .top:5757- lhi %r7,4096 #load PAGE_SIZE in r75858- lhi %r9,4096 #load PAGE_SIZE in r95959- l %r5,0(%r2) #read another word for indirection page6060- ahi %r2,4 #increment pointer6161- tml %r5,0x1 #is it a destination page?6262- je .indir_check #NO, goto "indir_check"6363- lr %r6,%r5 #r6 = r56464- nr %r6,%r10 #mask it out and...6565- j .top #...next iteration5757+ lhi %r7,4096 # load PAGE_SIZE in r75858+ lhi %r9,4096 # load PAGE_SIZE in r95959+ l %r5,0(%r2) # read another word for indirection page6060+ ahi %r2,4 # increment pointer6161+ tml %r5,0x1 # is it a destination page?6262+ je .indir_check # NO, goto "indir_check"6363+ lr %r6,%r5 # r6 = r56464+ nr %r6,%r10 # mask it out and...6565+ j .top # ...next iteration6666 .indir_check:6767- tml %r5,0x2 #is it a indirection page?6868- je .done_test #NO, goto "done_test"6969- nr %r5,%r10 #YES, mask out,7070- lr %r2,%r5 #move it into the right register,7171- j .top #and read next...6767+ tml %r5,0x2 # is it a indirection page?6868+ je .done_test # NO, goto "done_test"6969+ nr %r5,%r10 # YES, mask out,7070+ lr %r2,%r5 # move it into the right register,7171+ j .top # and read next...7272 .done_test:7373- tml %r5,0x4 #is it the done indicator?7474- je .source_test #NO! Well, then it should be the source indicator...7575- j .done #ok, lets finish it here...7373+ tml %r5,0x4 # is it the done indicator?7474+ je .source_test # NO! Well, then it should be the source indicator...7575+ j .done # ok, lets finish it here...7676 .source_test:7777- tml %r5,0x8 #it should be a source indicator...7878- je .top #NO, ignore it...7979- lr %r8,%r5 #r8 = r58080- nr %r8,%r10 #masking8181- 0: mvcle %r6,%r8,0x0 #copy PAGE_SIZE bytes from r8 to r6 - pad with 07777+ tml %r5,0x8 # it should be a source indicator...7878+ je .top # NO, ignore it...7979+ lr %r8,%r5 # r8 = r58080+ nr %r8,%r10 # masking8181+ 0: mvcle %r6,%r8,0x0 # copy PAGE_SIZE bytes from r8 to r6 - pad with 08282 jo 0b8383 j .top8484 .done:8585- sr %r0,%r0 #clear register r08686- la %r4,load_psw-.base(%r13) #load psw-address into the register8787- o %r3,4(%r4) #or load address into psw8585+ sr %r0,%r0 # clear register r08686+ la %r4,load_psw-.base(%r13) # load psw-address into the register8787+ o %r3,4(%r4) # or load address into psw8888 st %r3,4(%r4)8989- mvc 0(8,%r0),0(%r4) #copy psw to absolute address 08989+ mvc 0(8,%r0),0(%r4) # copy psw to absolute address 09090 tm have_diag308-.base(%r13),0x019191 jno .no_diag3089292 diag %r0,%r0,0x3089393 .no_diag308:9494- sr %r1,%r1 #clear %r19595- sr %r2,%r2 #clear %r29696- sigp %r1,%r2,0x12 #set cpuid to zero9797- lpsw 0 #hopefully start new kernel...9494+ sr %r1,%r1 # clear %r19595+ sr %r2,%r2 # clear %r29696+ sigp %r1,%r2,0x12 # set cpuid to zero9797+ lpsw 0 # hopefully start new kernel...98989999 .align 8100100 zero64:
+41-41
arch/s390/kernel/relocate_kernel64.S
···33 *44 * (C) Copyright IBM Corp. 200555 *66- * Author(s): Rolf Adelsberger <adelsberger@de.ibm.com>66+ * Author(s): Rolf Adelsberger,77 * Heiko Carstens <heiko.carstens@de.ibm.com>88 *99 */···2525 .text2626 .globl relocate_kernel2727 relocate_kernel:2828- basr %r13,0 #base address2828+ basr %r13,0 # base address2929 .base:3030- stnsm sys_msk-.base(%r13),0xf8 #disable DAT and IRQs3131- spx zero64-.base(%r13) #absolute addressing mode3030+ stnsm sys_msk-.base(%r13),0xf8 # disable DAT and IRQs3131+ spx zero64-.base(%r13) # absolute addressing mode3232 stctg %c0,%c15,ctlregs-.base(%r13)3333 stmg %r0,%r15,gprregs-.base(%r13)3434 lghi %r0,3···3737 la %r0,.back_pgm-.base(%r13)3838 stg %r0,0x1d8(%r0)3939 la %r1,load_psw-.base(%r13)4040- mvc 0(8,%r0),0(%r1)4040+ mvc 0(8,%r0),0(%r1)4141 la %r0,.back-.base(%r13)4242 st %r0,4(%r0)4343 oi 4(%r0),0x804444 lghi %r0,04545 diag %r0,%r0,0x3084646 .back:4747- lhi %r1,1 #mode 1 = esame4848- sigp %r1,%r0,0x12 #switch to esame mode4949- sam64 #switch to 64 bit addressing mode4747+ lhi %r1,1 # mode 1 = esame4848+ sigp %r1,%r0,0x12 # switch to esame mode4949+ sam64 # switch to 64 bit addressing mode5050 basr %r13,05151 .back_base:5252 oi have_diag308-.back_base(%r13),0x01···5656 .back_pgm:5757 lmg %r0,%r15,gprregs-.base(%r13)5858 .top:5959- lghi %r7,4096 #load PAGE_SIZE in r76060- lghi %r9,4096 #load PAGE_SIZE in r96161- lg %r5,0(%r2) #read another word for indirection page6262- aghi %r2,8 #increment pointer6363- tml %r5,0x1 #is it a destination page?6464- je .indir_check #NO, goto "indir_check"6565- lgr %r6,%r5 #r6 = r56666- nill %r6,0xf000 #mask it out and...6767- j .top #...next iteration5959+ lghi %r7,4096 # load PAGE_SIZE in r76060+ lghi %r9,4096 # load PAGE_SIZE in r96161+ lg %r5,0(%r2) # read another word for indirection page6262+ aghi %r2,8 # increment pointer6363+ tml %r5,0x1 # is it a destination page?6464+ je .indir_check # NO, goto "indir_check"6565+ lgr %r6,%r5 # r6 = r56666+ nill %r6,0xf000 # mask it out and...6767+ j .top # ...next iteration6868 .indir_check:6969- tml %r5,0x2 #is it a indirection page?7070- je .done_test #NO, goto "done_test"7171- nill %r5,0xf000 #YES, mask out,7272- lgr %r2,%r5 #move it into the right register,7373- j .top #and read next...6969+ tml %r5,0x2 # is it a indirection page?7070+ je .done_test # NO, goto "done_test"7171+ nill %r5,0xf000 # YES, mask out,7272+ lgr %r2,%r5 # move it into the right register,7373+ j .top # and read next...7474 .done_test:7575- tml %r5,0x4 #is it the done indicator?7676- je .source_test #NO! Well, then it should be the source indicator...7777- j .done #ok, lets finish it here...7575+ tml %r5,0x4 # is it the done indicator?7676+ je .source_test # NO! Well, then it should be the source indicator...7777+ j .done # ok, lets finish it here...7878 .source_test:7979- tml %r5,0x8 #it should be a source indicator...8080- je .top #NO, ignore it...8181- lgr %r8,%r5 #r8 = r58282- nill %r8,0xf000 #masking8383- 0: mvcle %r6,%r8,0x0 #copy PAGE_SIZE bytes from r8 to r6 - pad with 07979+ tml %r5,0x8 # it should be a source indicator...8080+ je .top # NO, ignore it...8181+ lgr %r8,%r5 # r8 = r58282+ nill %r8,0xf000 # masking8383+ 0: mvcle %r6,%r8,0x0 # copy PAGE_SIZE bytes from r8 to r6 - pad with 08484 jo 0b8585- j .top8585+ j .top8686 .done:8787- sgr %r0,%r0 #clear register r08888- la %r4,load_psw-.base(%r13) #load psw-address into the register8989- o %r3,4(%r4) #or load address into psw8787+ sgr %r0,%r0 # clear register r08888+ la %r4,load_psw-.base(%r13) # load psw-address into the register8989+ o %r3,4(%r4) # or load address into psw9090 st %r3,4(%r4)9191- mvc 0(8,%r0),0(%r4) #copy psw to absolute address 09191+ mvc 0(8,%r0),0(%r4) # copy psw to absolute address 09292 tm have_diag308-.base(%r13),0x019393 jno .no_diag3089494 diag %r0,%r0,0x3089595 .no_diag308:9696- sam31 #31 bit mode9797- sr %r1,%r1 #erase register r19898- sr %r2,%r2 #erase register r29999- sigp %r1,%r2,0x12 #set cpuid to zero100100- lpsw 0 #hopefully start new kernel...9696+ sam31 # 31 bit mode9797+ sr %r1,%r1 # erase register r19898+ sr %r2,%r2 # erase register r29999+ sigp %r1,%r2,0x12 # set cpuid to zero100100+ lpsw 0 # hopefully start new kernel...101101102102- .align 8102102+ .align 8103103 zero64:104104 .quad 0105105 load_psw: