···6969 bool7070 default y if KVM71717272+config VIRT_CPU_ACCOUNTING7373+ def_bool y7474+7275mainmenu "Linux Kernel Configuration"73767477config S390···472469 hypervisor. The ESSA instruction is used to do the states473470 changes between a page that has content and the unused state.474471475475-config VIRT_TIMER476476- bool "Virtual CPU timer support"477477- help478478- This provides a kernel interface for virtual CPU timers.479479- Default is disabled.480480-481481-config VIRT_CPU_ACCOUNTING482482- bool "Base user process accounting on virtual cpu timer"483483- depends on VIRT_TIMER484484- help485485- Select this option to use CPU timer deltas to do user486486- process accounting.487487-488472config APPLDATA_BASE489473 bool "Linux - VM Monitor Stream, base infrastructure"490490- depends on PROC_FS && VIRT_TIMER=y474474+ depends on PROC_FS491475 help492476 This provides a kernel interface for creating and updating z/VM APPLDATA493477 monitor records. The monitor records are updated at certain time
···109109 * R15 - kernel stack pointer110110 */111111112112- .macro STORE_TIMER lc_offset113113-#ifdef CONFIG_VIRT_CPU_ACCOUNTING114114- stpt \lc_offset115115-#endif116116- .endm117117-118118-#ifdef CONFIG_VIRT_CPU_ACCOUNTING119112 .macro UPDATE_VTIME lc_from,lc_to,lc_sum120113 lm %r10,%r11,\lc_from121114 sl %r10,\lc_to···121128 al %r10,BASED(.Lc_1)1221291: stm %r10,%r11,\lc_sum123130 .endm124124-#endif125131126132 .macro SAVE_ALL_BASE savearea127133 stm %r12,%r15,\savearea···190198 ni \psworg+1,0xfd # clear wait state bit191199 .endif192200 lm %r0,%r15,SP_R0(%r15) # load gprs 0-15 of user193193- STORE_TIMER __LC_EXIT_TIMER201201+ stpt __LC_EXIT_TIMER194202 lpsw \psworg # back to caller195203 .endm196204···239247240248 .globl system_call241249system_call:242242- STORE_TIMER __LC_SYNC_ENTER_TIMER250250+ stpt __LC_SYNC_ENTER_TIMER243251sysc_saveall:244252 SAVE_ALL_BASE __LC_SAVE_AREA245253 SAVE_ALL_SVC __LC_SVC_OLD_PSW,__LC_SAVE_AREA246254 CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA247255 lh %r7,0x8a # get svc number from lowcore248248-#ifdef CONFIG_VIRT_CPU_ACCOUNTING249256sysc_vtime:250257 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER251258sysc_stime:252259 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER253260sysc_update:254261 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER255255-#endif256262sysc_do_svc:257263 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct258264 ltr %r7,%r7 # test for svc 0···480490 * we just ignore the PER event (FIXME: is there anything we have to do481491 * for LPSW?).482492 */483483- STORE_TIMER __LC_SYNC_ENTER_TIMER493493+ stpt __LC_SYNC_ENTER_TIMER484494 SAVE_ALL_BASE __LC_SAVE_AREA485495 tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception486496 bnz BASED(pgm_per) # got per exception -> special case487497 SAVE_ALL_SYNC __LC_PGM_OLD_PSW,__LC_SAVE_AREA488498 CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA489489-#ifdef CONFIG_VIRT_CPU_ACCOUNTING490499 tm SP_PSW+1(%r15),0x01 # interrupting from user ?491500 bz BASED(pgm_no_vtime)492501 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER493502 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER494503 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER495504pgm_no_vtime:496496-#endif497505 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct498506 TRACE_IRQS_OFF499507 l %r3,__LC_PGM_ILC # load program interruption code···524536pgm_per_std:525537 SAVE_ALL_SYNC __LC_PGM_OLD_PSW,__LC_SAVE_AREA526538 CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA527527-#ifdef CONFIG_VIRT_CPU_ACCOUNTING528539 tm SP_PSW+1(%r15),0x01 # interrupting from user ?529540 bz BASED(pgm_no_vtime2)530541 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER531542 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER532543 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER533544pgm_no_vtime2:534534-#endif535545 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct536546 TRACE_IRQS_OFF537547 l %r1,__TI_task(%r9)···551565pgm_svcper:552566 SAVE_ALL_SYNC __LC_SVC_OLD_PSW,__LC_SAVE_AREA553567 CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA554554-#ifdef CONFIG_VIRT_CPU_ACCOUNTING555568 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER556569 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER557570 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER558558-#endif559571 lh %r7,0x8a # get svc number from lowcore560572 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct561573 TRACE_IRQS_OFF···583599584600 .globl io_int_handler585601io_int_handler:586586- STORE_TIMER __LC_ASYNC_ENTER_TIMER602602+ stpt __LC_ASYNC_ENTER_TIMER587603 stck __LC_INT_CLOCK588604 SAVE_ALL_BASE __LC_SAVE_AREA+16589605 SAVE_ALL_ASYNC __LC_IO_OLD_PSW,__LC_SAVE_AREA+16590606 CREATE_STACK_FRAME __LC_IO_OLD_PSW,__LC_SAVE_AREA+16591591-#ifdef CONFIG_VIRT_CPU_ACCOUNTING592607 tm SP_PSW+1(%r15),0x01 # interrupting from user ?593608 bz BASED(io_no_vtime)594609 UPDATE_VTIME __LC_EXIT_TIMER,__LC_ASYNC_ENTER_TIMER,__LC_USER_TIMER595610 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER596611 mvc __LC_LAST_UPDATE_TIMER(8),__LC_ASYNC_ENTER_TIMER597612io_no_vtime:598598-#endif599613 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct600614 TRACE_IRQS_OFF601615 l %r1,BASED(.Ldo_IRQ) # load address of do_IRQ···723741724742 .globl ext_int_handler725743ext_int_handler:726726- STORE_TIMER __LC_ASYNC_ENTER_TIMER744744+ stpt __LC_ASYNC_ENTER_TIMER727745 stck __LC_INT_CLOCK728746 SAVE_ALL_BASE __LC_SAVE_AREA+16729747 SAVE_ALL_ASYNC __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16730748 CREATE_STACK_FRAME __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16731731-#ifdef CONFIG_VIRT_CPU_ACCOUNTING732749 tm SP_PSW+1(%r15),0x01 # interrupting from user ?733750 bz BASED(ext_no_vtime)734751 UPDATE_VTIME __LC_EXIT_TIMER,__LC_ASYNC_ENTER_TIMER,__LC_USER_TIMER735752 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER736753 mvc __LC_LAST_UPDATE_TIMER(8),__LC_ASYNC_ENTER_TIMER737754ext_no_vtime:738738-#endif739755 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct740756 TRACE_IRQS_OFF741757 la %r2,SP_PTREGS(%r15) # address of register-save area···756776 la %r12,__LC_MCK_OLD_PSW757777 tm __LC_MCCK_CODE,0x80 # system damage?758778 bo BASED(mcck_int_main) # yes -> rest of mcck code invalid759759-#ifdef CONFIG_VIRT_CPU_ACCOUNTING760779 mvc __LC_SAVE_AREA+52(8),__LC_ASYNC_ENTER_TIMER761780 mvc __LC_ASYNC_ENTER_TIMER(8),__LC_CPU_TIMER_SAVE_AREA762781 tm __LC_MCCK_CODE+5,0x02 # stored cpu timer value valid?···772793 la %r14,__LC_LAST_UPDATE_TIMER7737940: spt 0(%r14)774795 mvc __LC_ASYNC_ENTER_TIMER(8),0(%r14)775775-1:776776-#endif777777- tm __LC_MCCK_CODE+2,0x09 # mwp + ia of old psw valid?796796+1: tm __LC_MCCK_CODE+2,0x09 # mwp + ia of old psw valid?778797 bno BASED(mcck_int_main) # no -> skip cleanup critical779798 tm __LC_MCK_OLD_PSW+1,0x01 # test problem state bit780799 bnz BASED(mcck_int_main) # from user -> load async stack···789812 be BASED(0f)790813 l %r15,__LC_PANIC_STACK # load panic stack7918140: CREATE_STACK_FRAME __LC_MCK_OLD_PSW,__LC_SAVE_AREA+32792792-#ifdef CONFIG_VIRT_CPU_ACCOUNTING793815 tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid?794816 bno BASED(mcck_no_vtime) # no -> skip cleanup critical795817 tm SP_PSW+1(%r15),0x01 # interrupting from user ?···797821 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER798822 mvc __LC_LAST_UPDATE_TIMER(8),__LC_ASYNC_ENTER_TIMER799823mcck_no_vtime:800800-#endif801824 l %r9,__LC_THREAD_INFO # load pointer to thread_info struct802825 la %r2,SP_PTREGS(%r15) # load pt_regs803826 l %r1,BASED(.Ls390_mcck)···818843mcck_return:819844 mvc __LC_RETURN_MCCK_PSW(8),SP_PSW(%r15) # move return PSW820845 ni __LC_RETURN_MCCK_PSW+1,0xfd # clear wait state bit821821-#ifdef CONFIG_VIRT_CPU_ACCOUNTING822846 mvc __LC_ASYNC_ENTER_TIMER(8),__LC_SAVE_AREA+52823847 tm __LC_RETURN_MCCK_PSW+1,0x01 # returning to user ?824848 bno BASED(0f)825849 lm %r0,%r15,SP_R0(%r15) # load gprs 0-15826850 stpt __LC_EXIT_TIMER827851 lpsw __LC_RETURN_MCCK_PSW # back to caller828828-0:829829-#endif830830- lm %r0,%r15,SP_R0(%r15) # load gprs 0-15852852+0: lm %r0,%r15,SP_R0(%r15) # load gprs 0-15831853 lpsw __LC_RETURN_MCCK_PSW # back to caller832854833855 RESTORE_ALL __LC_RETURN_MCCK_PSW,0···948976 b BASED(1f)9499770: la %r12,__LC_SAVE_AREA+329509781:951951-#ifdef CONFIG_VIRT_CPU_ACCOUNTING952979 clc __LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn+4)953980 bh BASED(0f)954981 mvc __LC_SYNC_ENTER_TIMER(8),__LC_ASYNC_ENTER_TIMER9559820: clc __LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn+8)956983 bhe BASED(cleanup_vtime)957957-#endif958984 clc __LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn)959985 bh BASED(0f)960986 mvc __LC_SAVE_AREA(16),0(%r12)···963993 l %r12,__LC_SAVE_AREA+48 # argh964994 st %r15,12(%r12)965995 lh %r7,0x8a966966-#ifdef CONFIG_VIRT_CPU_ACCOUNTING967996cleanup_vtime:968997 clc __LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn+12)969998 bhe BASED(cleanup_stime)···9731004 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER9741005cleanup_update:9751006 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER976976-#endif9771007 mvc __LC_RETURN_PSW+4(4),BASED(cleanup_table_system_call+4)9781008 la %r12,__LC_RETURN_PSW9791009 br %r149801010cleanup_system_call_insn:9811011 .long sysc_saveall + 0x80000000982982-#ifdef CONFIG_VIRT_CPU_ACCOUNTING9831012 .long system_call + 0x800000009841013 .long sysc_vtime + 0x800000009851014 .long sysc_stime + 0x800000009861015 .long sysc_update + 0x80000000987987-#endif98810169891017cleanup_sysc_return:9901018 mvc __LC_RETURN_PSW(4),0(%r12)···9921026cleanup_sysc_leave:9931027 clc 4(4,%r12),BASED(cleanup_sysc_leave_insn)9941028 be BASED(2f)995995-#ifdef CONFIG_VIRT_CPU_ACCOUNTING9961029 mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER9971030 clc 4(4,%r12),BASED(cleanup_sysc_leave_insn+4)9981031 be BASED(2f)999999-#endif10001032 mvc __LC_RETURN_PSW(8),SP_PSW(%r15)10011033 c %r12,BASED(.Lmck_old_psw)10021034 bne BASED(0f)···10071043 br %r1410081044cleanup_sysc_leave_insn:10091045 .long sysc_done - 4 + 0x8000000010101010-#ifdef CONFIG_VIRT_CPU_ACCOUNTING10111046 .long sysc_done - 8 + 0x8000000010121012-#endif1013104710141048cleanup_io_return:10151049 mvc __LC_RETURN_PSW(4),0(%r12)···10181056cleanup_io_leave:10191057 clc 4(4,%r12),BASED(cleanup_io_leave_insn)10201058 be BASED(2f)10211021-#ifdef CONFIG_VIRT_CPU_ACCOUNTING10221059 mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER10231060 clc 4(4,%r12),BASED(cleanup_io_leave_insn+4)10241061 be BASED(2f)10251025-#endif10261062 mvc __LC_RETURN_PSW(8),SP_PSW(%r15)10271063 c %r12,BASED(.Lmck_old_psw)10281064 bne BASED(0f)···10331073 br %r1410341074cleanup_io_leave_insn:10351075 .long io_done - 4 + 0x8000000010361036-#ifdef CONFIG_VIRT_CPU_ACCOUNTING10371076 .long io_done - 8 + 0x8000000010381038-#endif1039107710401078/*10411079 * Integer constants
+7-49
arch/s390/kernel/entry64.S
···9696#define LOCKDEP_SYS_EXIT9797#endif98989999- .macro STORE_TIMER lc_offset100100-#ifdef CONFIG_VIRT_CPU_ACCOUNTING101101- stpt \lc_offset102102-#endif103103- .endm104104-105105-#ifdef CONFIG_VIRT_CPU_ACCOUNTING10699 .macro UPDATE_VTIME lc_from,lc_to,lc_sum107100 lg %r10,\lc_from108101 slg %r10,\lc_to109102 alg %r10,\lc_sum110103 stg %r10,\lc_sum111104 .endm112112-#endif113105114106/*115107 * Register usage in interrupt handlers:···178186 ni \psworg+1,0xfd # clear wait state bit179187 .endif180188 lmg %r0,%r15,SP_R0(%r15) # load gprs 0-15 of user181181- STORE_TIMER __LC_EXIT_TIMER189189+ stpt __LC_EXIT_TIMER182190 lpswe \psworg # back to caller183191 .endm184192···225233226234 .globl system_call227235system_call:228228- STORE_TIMER __LC_SYNC_ENTER_TIMER236236+ stpt __LC_SYNC_ENTER_TIMER229237sysc_saveall:230238 SAVE_ALL_BASE __LC_SAVE_AREA231239 SAVE_ALL_SVC __LC_SVC_OLD_PSW,__LC_SAVE_AREA232240 CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA233241 llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore234234-#ifdef CONFIG_VIRT_CPU_ACCOUNTING235242sysc_vtime:236243 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER237244sysc_stime:238245 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER239246sysc_update:240247 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER241241-#endif242248sysc_do_svc:243249 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct244250 ltgr %r7,%r7 # test for svc 0···459469 * we just ignore the PER event (FIXME: is there anything we have to do460470 * for LPSW?).461471 */462462- STORE_TIMER __LC_SYNC_ENTER_TIMER472472+ stpt __LC_SYNC_ENTER_TIMER463473 SAVE_ALL_BASE __LC_SAVE_AREA464474 tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception465475 jnz pgm_per # got per exception -> special case466476 SAVE_ALL_SYNC __LC_PGM_OLD_PSW,__LC_SAVE_AREA467477 CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA468468-#ifdef CONFIG_VIRT_CPU_ACCOUNTING469478 tm SP_PSW+1(%r15),0x01 # interrupting from user ?470479 jz pgm_no_vtime471480 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER472481 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER473482 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER474483pgm_no_vtime:475475-#endif476484 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct477485 mvc SP_ARGS(8,%r15),__LC_LAST_BREAK478486 TRACE_IRQS_OFF···504516pgm_per_std:505517 SAVE_ALL_SYNC __LC_PGM_OLD_PSW,__LC_SAVE_AREA506518 CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA507507-#ifdef CONFIG_VIRT_CPU_ACCOUNTING508519 tm SP_PSW+1(%r15),0x01 # interrupting from user ?509520 jz pgm_no_vtime2510521 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER511522 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER512523 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER513524pgm_no_vtime2:514514-#endif515525 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct516526 TRACE_IRQS_OFF517527 lg %r1,__TI_task(%r9)···531545pgm_svcper:532546 SAVE_ALL_SYNC __LC_SVC_OLD_PSW,__LC_SAVE_AREA533547 CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA534534-#ifdef CONFIG_VIRT_CPU_ACCOUNTING535548 UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER536549 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER537550 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER538538-#endif539551 llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore540552 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct541553 lg %r1,__TI_task(%r9)···559575 */560576 .globl io_int_handler561577io_int_handler:562562- STORE_TIMER __LC_ASYNC_ENTER_TIMER578578+ stpt __LC_ASYNC_ENTER_TIMER563579 stck __LC_INT_CLOCK564580 SAVE_ALL_BASE __LC_SAVE_AREA+32565581 SAVE_ALL_ASYNC __LC_IO_OLD_PSW,__LC_SAVE_AREA+32566582 CREATE_STACK_FRAME __LC_IO_OLD_PSW,__LC_SAVE_AREA+32567567-#ifdef CONFIG_VIRT_CPU_ACCOUNTING568583 tm SP_PSW+1(%r15),0x01 # interrupting from user ?569584 jz io_no_vtime570585 UPDATE_VTIME __LC_EXIT_TIMER,__LC_ASYNC_ENTER_TIMER,__LC_USER_TIMER571586 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER572587 mvc __LC_LAST_UPDATE_TIMER(8),__LC_ASYNC_ENTER_TIMER573588io_no_vtime:574574-#endif575589 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct576590 TRACE_IRQS_OFF577591 la %r2,SP_PTREGS(%r15) # address of register-save area···721739 */722740 .globl ext_int_handler723741ext_int_handler:724724- STORE_TIMER __LC_ASYNC_ENTER_TIMER742742+ stpt __LC_ASYNC_ENTER_TIMER725743 stck __LC_INT_CLOCK726744 SAVE_ALL_BASE __LC_SAVE_AREA+32727745 SAVE_ALL_ASYNC __LC_EXT_OLD_PSW,__LC_SAVE_AREA+32728746 CREATE_STACK_FRAME __LC_EXT_OLD_PSW,__LC_SAVE_AREA+32729729-#ifdef CONFIG_VIRT_CPU_ACCOUNTING730747 tm SP_PSW+1(%r15),0x01 # interrupting from user ?731748 jz ext_no_vtime732749 UPDATE_VTIME __LC_EXIT_TIMER,__LC_ASYNC_ENTER_TIMER,__LC_USER_TIMER733750 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER734751 mvc __LC_LAST_UPDATE_TIMER(8),__LC_ASYNC_ENTER_TIMER735752ext_no_vtime:736736-#endif737753 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct738754 TRACE_IRQS_OFF739755 la %r2,SP_PTREGS(%r15) # address of register-save area···753773 la %r12,__LC_MCK_OLD_PSW754774 tm __LC_MCCK_CODE,0x80 # system damage?755775 jo mcck_int_main # yes -> rest of mcck code invalid756756-#ifdef CONFIG_VIRT_CPU_ACCOUNTING757776 la %r14,4095758777 mvc __LC_SAVE_AREA+104(8),__LC_ASYNC_ENTER_TIMER759778 mvc __LC_ASYNC_ENTER_TIMER(8),__LC_CPU_TIMER_SAVE_AREA-4095(%r14)···770791 la %r14,__LC_LAST_UPDATE_TIMER7717920: spt 0(%r14)772793 mvc __LC_ASYNC_ENTER_TIMER(8),0(%r14)773773-1:774774-#endif775775- tm __LC_MCCK_CODE+2,0x09 # mwp + ia of old psw valid?794794+1: tm __LC_MCCK_CODE+2,0x09 # mwp + ia of old psw valid?776795 jno mcck_int_main # no -> skip cleanup critical777796 tm __LC_MCK_OLD_PSW+1,0x01 # test problem state bit778797 jnz mcck_int_main # from user -> load kernel stack···786809 jz 0f787810 lg %r15,__LC_PANIC_STACK # load panic stack7888110: CREATE_STACK_FRAME __LC_MCK_OLD_PSW,__LC_SAVE_AREA+64789789-#ifdef CONFIG_VIRT_CPU_ACCOUNTING790812 tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid?791813 jno mcck_no_vtime # no -> no timer update792814 tm SP_PSW+1(%r15),0x01 # interrupting from user ?···794818 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER795819 mvc __LC_LAST_UPDATE_TIMER(8),__LC_ASYNC_ENTER_TIMER796820mcck_no_vtime:797797-#endif798821 lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct799822 la %r2,SP_PTREGS(%r15) # load pt_regs800823 brasl %r14,s390_do_machine_check···814839 mvc __LC_RETURN_MCCK_PSW(16),SP_PSW(%r15) # move return PSW815840 ni __LC_RETURN_MCCK_PSW+1,0xfd # clear wait state bit816841 lmg %r0,%r15,SP_R0(%r15) # load gprs 0-15817817-#ifdef CONFIG_VIRT_CPU_ACCOUNTING818842 mvc __LC_ASYNC_ENTER_TIMER(8),__LC_SAVE_AREA+104819843 tm __LC_RETURN_MCCK_PSW+1,0x01 # returning to user ?820844 jno 0f821845 stpt __LC_EXIT_TIMER822822-0:823823-#endif824824- lpswe __LC_RETURN_MCCK_PSW # back to caller846846+0: lpswe __LC_RETURN_MCCK_PSW # back to caller825847826848/*827849 * Restart interruption handler, kick starter for additional CPUs···936964 j 1f9379650: la %r12,__LC_SAVE_AREA+649389661:939939-#ifdef CONFIG_VIRT_CPU_ACCOUNTING940967 clc __LC_RETURN_PSW+8(8),BASED(cleanup_system_call_insn+8)941968 jh 0f942969 mvc __LC_SYNC_ENTER_TIMER(8),__LC_ASYNC_ENTER_TIMER9439700: clc __LC_RETURN_PSW+8(8),BASED(cleanup_system_call_insn+16)944971 jhe cleanup_vtime945945-#endif946972 clc __LC_RETURN_PSW+8(8),BASED(cleanup_system_call_insn)947973 jh 0f948974 mvc __LC_SAVE_AREA(32),0(%r12)···951981 lg %r12,__LC_SAVE_AREA+96 # argh952982 stg %r15,24(%r12)953983 llgh %r7,__LC_SVC_INT_CODE954954-#ifdef CONFIG_VIRT_CPU_ACCOUNTING955984cleanup_vtime:956985 clc __LC_RETURN_PSW+8(8),BASED(cleanup_system_call_insn+24)957986 jhe cleanup_stime···961992 UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER962993cleanup_update:963994 mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER964964-#endif965995 mvc __LC_RETURN_PSW+8(8),BASED(cleanup_table_system_call+8)966996 la %r12,__LC_RETURN_PSW967997 br %r14968998cleanup_system_call_insn:969999 .quad sysc_saveall970970-#ifdef CONFIG_VIRT_CPU_ACCOUNTING9711000 .quad system_call9721001 .quad sysc_vtime9731002 .quad sysc_stime9741003 .quad sysc_update975975-#endif97610049771005cleanup_sysc_return:9781006 mvc __LC_RETURN_PSW(8),0(%r12)···9801014cleanup_sysc_leave:9811015 clc 8(8,%r12),BASED(cleanup_sysc_leave_insn)9821016 je 2f983983-#ifdef CONFIG_VIRT_CPU_ACCOUNTING9841017 mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER9851018 clc 8(8,%r12),BASED(cleanup_sysc_leave_insn+8)9861019 je 2f987987-#endif9881020 mvc __LC_RETURN_PSW(16),SP_PSW(%r15)9891021 cghi %r12,__LC_MCK_OLD_PSW9901022 jne 0f···9951031 br %r149961032cleanup_sysc_leave_insn:9971033 .quad sysc_done - 4998998-#ifdef CONFIG_VIRT_CPU_ACCOUNTING9991034 .quad sysc_done - 810001000-#endif1001103510021036cleanup_io_return:10031037 mvc __LC_RETURN_PSW(8),0(%r12)···10061044cleanup_io_leave:10071045 clc 8(8,%r12),BASED(cleanup_io_leave_insn)10081046 je 2f10091009-#ifdef CONFIG_VIRT_CPU_ACCOUNTING10101047 mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER10111048 clc 8(8,%r12),BASED(cleanup_io_leave_insn+8)10121049 je 2f10131013-#endif10141050 mvc __LC_RETURN_PSW(16),SP_PSW(%r15)10151051 cghi %r12,__LC_MCK_OLD_PSW10161052 jne 0f···10211061 br %r1410221062cleanup_io_leave_insn:10231063 .quad io_done - 410241024-#ifdef CONFIG_VIRT_CPU_ACCOUNTING10251064 .quad io_done - 810261026-#endif1027106510281066/*10291067 * Integer constants
-2
arch/s390/kernel/smp.c
···441441 preempt_disable();442442 /* Enable TOD clock interrupts on the secondary cpu. */443443 init_cpu_timer();444444-#ifdef CONFIG_VIRT_TIMER445444 /* Enable cpu timer interrupts on the secondary cpu. */446445 init_cpu_vtimer();447447-#endif448446 /* Enable pfault pseudo page faults on this cpu. */449447 pfault_init();450448
+1-3
arch/s390/kernel/time.c
···286286287287 /* Enable TOD clock interrupts on the boot cpu. */288288 init_cpu_timer();289289-290290-#ifdef CONFIG_VIRT_TIMER289289+ /* Enable cpu timer interrupts on the boot cpu. */291290 vtime_init();292292-#endif293291}294292295293/*
-11
arch/s390/kernel/vtime.c
···2727static ext_int_info_t ext_int_info_timer;2828static DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer);29293030-#ifdef CONFIG_VIRT_CPU_ACCOUNTING3130/*3231 * Update process times based on virtual cpu times stored by entry.S3332 * to the lowcore fields user_timer, system_timer & steal_clock.···124125 /* store expire time for this CPU timer */125126 __get_cpu_var(virt_cpu_timer).to_expire = expires;126127}127127-#else128128-static inline void set_vtimer(__u64 expires)129129-{130130- S390_lowcore.last_update_timer = expires;131131- asm volatile ("SPT %0" : : "m" (S390_lowcore.last_update_timer));132132-133133- /* store expire time for this CPU timer */134134- __get_cpu_var(virt_cpu_timer).to_expire = expires;135135-}136136-#endif137128138129void vtime_start_cpu_timer(void)139130{