/* *DisableVMXforthetaskwhichhaditpreviously, *andsaveitsvectorregistersinitsthread_struct. *EnablestheVMXforuseinthekernelonreturn. *OnSMPweknowtheVMXisfree,sincewegiveitupevery *switch(ie,nolazysaveofthevectorregisters). * *Notethaton32-bitthiscanonlyuseregistersthatwillbe *restoredbyfast_exception_return,i.e.r3-r6,r10andr11.
*/
_GLOBAL(load_up_altivec)
mfmsr r5 /* grab the current MSR */
#ifdef CONFIG_PPC_BOOK3S_64 /* interrupt doesn't set MSR[RI] and HPT can fault on current access */
ori r5,r5,MSR_RI
#endif
oris r5,r5,MSR_VEC@h
MTMSRD(r5) /* enable use of AltiVec now */
isync
/* *WhileuserspaceingeneralignoresVRSAVE,glibcusesitasaboolean *tooptimiseuserspacecontextsave/restore.Wheneverwetakean *altivecunavailableexceptionwemustsetVRSAVEtosomethingnon *zero.Setittoall1s.SeealsotheprogrammingnoteintheISA.
*/
mfspr r4,SPRN_VRSAVE
cmpwi 0,r4,0
bne+ 1f
li r4,-1
mtspr SPRN_VRSAVE,r4 1: /* enable use of VMX after return */
#ifdef CONFIG_PPC32
addi r5,r2,THREAD
oris r9,r9,MSR_VEC@h
#else ld r4,PACACURRENT(r13)
addi r5,r4,THREAD /* Get THREAD */
oris r12,r12,MSR_VEC@h
std r12,_MSR(r1)
#ifdef CONFIG_PPC_BOOK3S_64
li r4,0
stb r4,PACASRR_VALID(r13)
#endif
#endif
li r4,1
stb r4,THREAD_LOAD_VEC(r5)
addi r6,r5,THREAD_VRSTATE
li r10,VRSTATE_VSCR
stw r4,THREAD_USED_VR(r5)
lvx v0,r10,r6
mtvscr v0
REST_32VRS(0,r4,r6) /* restore registers and return */
blr
_ASM_NOKPROBE_SYMBOL(load_up_altivec)
#ifdef CONFIG_PPC32
#error This asm code isn't ready for 32-bit kernels
#endif
/* *load_up_vsx(unused,unused,tsk) *DisableVSXforthetaskwhichhaditpreviously, *andsaveitsvectorregistersinitsthread_struct. *Reusethefpandvsxsaves,butfirstchecktoseeiftheyhave *beensavedalready.
*/
_GLOBAL(load_up_vsx) /* Load FP and VSX registers if they haven't been done yet */
andi. r5,r12,MSR_FP
beql+ load_up_fpu /* skip if already loaded */
andis. r5,r12,MSR_VEC@h
beql+ load_up_altivec /* skip if already loaded */
#ifdef CONFIG_PPC_BOOK3S_64 /* interrupt doesn't set MSR[RI] and HPT can fault on current access */
li r5,MSR_RI
mtmsrd r5,1
#endif
ld r4,PACACURRENT(r13)
addi r4,r4,THREAD /* Get THREAD */
li r6,1
stw r6,THREAD_USED_VSR(r4) /* ... also set thread used vsr */ /* enable use of VSX after return */
oris r12,r12,MSR_VSX@h
std r12,_MSR(r1)
li r4,0
stb r4,PACASRR_VALID(r13)
b fast_interrupt_return_srr
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.