diff options
author | Michael Neuling <mikey@neuling.org> | 2008-06-25 00:07:18 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-06-30 21:28:50 -0400 |
commit | ce48b2100785e5ca629fb3aa8e3b50aca808f692 (patch) | |
tree | 63532ff7cc68b18ca4902bd10e03fcbaaf01cade /arch/powerpc/kernel/misc_64.S | |
parent | 72ffff5b1792b0fa4d40a8e2f3276fff999820ec (diff) |
powerpc: Add VSX context save/restore, ptrace and signal support
This patch extends the floating point save and restore code to use the
VSX load/stores when VSX is available. This will make FP context
save/restore marginally slower on FP only code, when VSX is available,
as it has to load/store 128bits rather than just 64bits.
Mixing FP, VMX and VSX code will get constant architected state.
The signals interface is extended to enable access to VSR 0-31
doubleword 1 after discussions with tool chain maintainers. Backward
compatibility is maintained.
The ptrace interface is also extended to allow access to VSR 0-31 full
registers.
Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel/misc_64.S')
-rw-r--r-- | arch/powerpc/kernel/misc_64.S | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index 942951e76586..31b9026cf1e3 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -506,6 +506,39 @@ _GLOBAL(giveup_altivec) | |||
506 | 506 | ||
507 | #endif /* CONFIG_ALTIVEC */ | 507 | #endif /* CONFIG_ALTIVEC */ |
508 | 508 | ||
509 | #ifdef CONFIG_VSX | ||
510 | /* | ||
511 | * giveup_vsx(tsk) | ||
512 | * Disable VSX for the task given as the argument, | ||
513 | * and save the vector registers in its thread_struct. | ||
514 | * Enables the VSX for use in the kernel on return. | ||
515 | */ | ||
516 | _GLOBAL(giveup_vsx) | ||
517 | mfmsr r5 | ||
518 | oris r5,r5,MSR_VSX@h | ||
519 | mtmsrd r5 /* enable use of VSX now */ | ||
520 | isync | ||
521 | |||
522 | cmpdi 0,r3,0 | ||
523 | beqlr- /* if no previous owner, done */ | ||
524 | addi r3,r3,THREAD /* want THREAD of task */ | ||
525 | ld r5,PT_REGS(r3) | ||
526 | cmpdi 0,r5,0 | ||
527 | beq 1f | ||
528 | ld r4,_MSR-STACK_FRAME_OVERHEAD(r5) | ||
529 | lis r3,MSR_VSX@h | ||
530 | andc r4,r4,r3 /* disable VSX for previous task */ | ||
531 | std r4,_MSR-STACK_FRAME_OVERHEAD(r5) | ||
532 | 1: | ||
533 | #ifndef CONFIG_SMP | ||
534 | li r5,0 | ||
535 | ld r4,last_task_used_vsx@got(r2) | ||
536 | std r5,0(r4) | ||
537 | #endif /* CONFIG_SMP */ | ||
538 | blr | ||
539 | |||
540 | #endif /* CONFIG_VSX */ | ||
541 | |||
509 | /* kexec_wait(phys_cpu) | 542 | /* kexec_wait(phys_cpu) |
510 | * | 543 | * |
511 | * wait for the flag to change, indicating this kernel is going away but | 544 | * wait for the flag to change, indicating this kernel is going away but |