1*478b8fecSSam Ravnborg/* 2*478b8fecSSam Ravnborg * VISsave.S: Code for saving FPU register state for 3*478b8fecSSam Ravnborg * VIS routines. One should not call this directly, 4*478b8fecSSam Ravnborg * but use macros provided in <asm/visasm.h>. 5*478b8fecSSam Ravnborg * 6*478b8fecSSam Ravnborg * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) 7*478b8fecSSam Ravnborg */ 8*478b8fecSSam Ravnborg 9*478b8fecSSam Ravnborg#include <asm/asi.h> 10*478b8fecSSam Ravnborg#include <asm/page.h> 11*478b8fecSSam Ravnborg#include <asm/ptrace.h> 12*478b8fecSSam Ravnborg#include <asm/visasm.h> 13*478b8fecSSam Ravnborg#include <asm/thread_info.h> 14*478b8fecSSam Ravnborg 15*478b8fecSSam Ravnborg .text 16*478b8fecSSam Ravnborg .globl VISenter, VISenterhalf 17*478b8fecSSam Ravnborg 18*478b8fecSSam Ravnborg /* On entry: %o5=current FPRS value, %g7 is callers address */ 19*478b8fecSSam Ravnborg /* May clobber %o5, %g1, %g2, %g3, %g7, %icc, %xcc */ 20*478b8fecSSam Ravnborg 21*478b8fecSSam Ravnborg /* Nothing special need be done here to handle pre-emption, this 22*478b8fecSSam Ravnborg * FPU save/restore mechanism is already preemption safe. 23*478b8fecSSam Ravnborg */ 24*478b8fecSSam Ravnborg 25*478b8fecSSam Ravnborg .align 32 26*478b8fecSSam RavnborgVISenter: 27*478b8fecSSam Ravnborg ldub [%g6 + TI_FPDEPTH], %g1 28*478b8fecSSam Ravnborg brnz,a,pn %g1, 1f 29*478b8fecSSam Ravnborg cmp %g1, 1 30*478b8fecSSam Ravnborg stb %g0, [%g6 + TI_FPSAVED] 31*478b8fecSSam Ravnborg stx %fsr, [%g6 + TI_XFSR] 32*478b8fecSSam Ravnborg9: jmpl %g7 + %g0, %g0 33*478b8fecSSam Ravnborg nop 34*478b8fecSSam Ravnborg1: bne,pn %icc, 2f 35*478b8fecSSam Ravnborg 36*478b8fecSSam Ravnborg srl %g1, 1, %g1 37*478b8fecSSam Ravnborgvis1: ldub [%g6 + TI_FPSAVED], %g3 38*478b8fecSSam Ravnborg stx %fsr, [%g6 + TI_XFSR] 39*478b8fecSSam Ravnborg or %g3, %o5, %g3 40*478b8fecSSam Ravnborg stb %g3, [%g6 + TI_FPSAVED] 41*478b8fecSSam Ravnborg rd %gsr, %g3 42*478b8fecSSam Ravnborg clr %g1 43*478b8fecSSam Ravnborg ba,pt %xcc, 3f 44*478b8fecSSam Ravnborg 45*478b8fecSSam Ravnborg stx %g3, [%g6 + TI_GSR] 46*478b8fecSSam Ravnborg2: add %g6, %g1, %g3 47*478b8fecSSam Ravnborg cmp %o5, FPRS_DU 48*478b8fecSSam Ravnborg be,pn %icc, 6f 49*478b8fecSSam Ravnborg sll %g1, 3, %g1 50*478b8fecSSam Ravnborg stb %o5, [%g3 + TI_FPSAVED] 51*478b8fecSSam Ravnborg rd %gsr, %g2 52*478b8fecSSam Ravnborg add %g6, %g1, %g3 53*478b8fecSSam Ravnborg stx %g2, [%g3 + TI_GSR] 54*478b8fecSSam Ravnborg 55*478b8fecSSam Ravnborg add %g6, %g1, %g2 56*478b8fecSSam Ravnborg stx %fsr, [%g2 + TI_XFSR] 57*478b8fecSSam Ravnborg sll %g1, 5, %g1 58*478b8fecSSam Ravnborg3: andcc %o5, FPRS_DL|FPRS_DU, %g0 59*478b8fecSSam Ravnborg be,pn %icc, 9b 60*478b8fecSSam Ravnborg add %g6, TI_FPREGS, %g2 61*478b8fecSSam Ravnborg andcc %o5, FPRS_DL, %g0 62*478b8fecSSam Ravnborg 63*478b8fecSSam Ravnborg be,pn %icc, 4f 64*478b8fecSSam Ravnborg add %g6, TI_FPREGS+0x40, %g3 65*478b8fecSSam Ravnborg membar #Sync 66*478b8fecSSam Ravnborg stda %f0, [%g2 + %g1] ASI_BLK_P 67*478b8fecSSam Ravnborg stda %f16, [%g3 + %g1] ASI_BLK_P 68*478b8fecSSam Ravnborg membar #Sync 69*478b8fecSSam Ravnborg andcc %o5, FPRS_DU, %g0 70*478b8fecSSam Ravnborg be,pn %icc, 5f 71*478b8fecSSam Ravnborg4: add %g1, 128, %g1 72*478b8fecSSam Ravnborg membar #Sync 73*478b8fecSSam Ravnborg stda %f32, [%g2 + %g1] ASI_BLK_P 74*478b8fecSSam Ravnborg 75*478b8fecSSam Ravnborg stda %f48, [%g3 + %g1] ASI_BLK_P 76*478b8fecSSam Ravnborg5: membar #Sync 77*478b8fecSSam Ravnborg ba,pt %xcc, 80f 78*478b8fecSSam Ravnborg nop 79*478b8fecSSam Ravnborg 80*478b8fecSSam Ravnborg .align 32 81*478b8fecSSam Ravnborg80: jmpl %g7 + %g0, %g0 82*478b8fecSSam Ravnborg nop 83*478b8fecSSam Ravnborg 84*478b8fecSSam Ravnborg6: ldub [%g3 + TI_FPSAVED], %o5 85*478b8fecSSam Ravnborg or %o5, FPRS_DU, %o5 86*478b8fecSSam Ravnborg add %g6, TI_FPREGS+0x80, %g2 87*478b8fecSSam Ravnborg stb %o5, [%g3 + TI_FPSAVED] 88*478b8fecSSam Ravnborg 89*478b8fecSSam Ravnborg sll %g1, 5, %g1 90*478b8fecSSam Ravnborg add %g6, TI_FPREGS+0xc0, %g3 91*478b8fecSSam Ravnborg wr %g0, FPRS_FEF, %fprs 92*478b8fecSSam Ravnborg membar #Sync 93*478b8fecSSam Ravnborg stda %f32, [%g2 + %g1] ASI_BLK_P 94*478b8fecSSam Ravnborg stda %f48, [%g3 + %g1] ASI_BLK_P 95*478b8fecSSam Ravnborg membar #Sync 96*478b8fecSSam Ravnborg ba,pt %xcc, 80f 97*478b8fecSSam Ravnborg nop 98*478b8fecSSam Ravnborg 99*478b8fecSSam Ravnborg .align 32 100*478b8fecSSam Ravnborg80: jmpl %g7 + %g0, %g0 101*478b8fecSSam Ravnborg nop 102*478b8fecSSam Ravnborg 103*478b8fecSSam Ravnborg .align 32 104*478b8fecSSam RavnborgVISenterhalf: 105*478b8fecSSam Ravnborg ldub [%g6 + TI_FPDEPTH], %g1 106*478b8fecSSam Ravnborg brnz,a,pn %g1, 1f 107*478b8fecSSam Ravnborg cmp %g1, 1 108*478b8fecSSam Ravnborg stb %g0, [%g6 + TI_FPSAVED] 109*478b8fecSSam Ravnborg stx %fsr, [%g6 + TI_XFSR] 110*478b8fecSSam Ravnborg clr %o5 111*478b8fecSSam Ravnborg jmpl %g7 + %g0, %g0 112*478b8fecSSam Ravnborg wr %g0, FPRS_FEF, %fprs 113*478b8fecSSam Ravnborg 114*478b8fecSSam Ravnborg1: bne,pn %icc, 2f 115*478b8fecSSam Ravnborg srl %g1, 1, %g1 116*478b8fecSSam Ravnborg ba,pt %xcc, vis1 117*478b8fecSSam Ravnborg sub %g7, 8, %g7 118*478b8fecSSam Ravnborg2: addcc %g6, %g1, %g3 119*478b8fecSSam Ravnborg sll %g1, 3, %g1 120*478b8fecSSam Ravnborg andn %o5, FPRS_DU, %g2 121*478b8fecSSam Ravnborg stb %g2, [%g3 + TI_FPSAVED] 122*478b8fecSSam Ravnborg 123*478b8fecSSam Ravnborg rd %gsr, %g2 124*478b8fecSSam Ravnborg add %g6, %g1, %g3 125*478b8fecSSam Ravnborg stx %g2, [%g3 + TI_GSR] 126*478b8fecSSam Ravnborg add %g6, %g1, %g2 127*478b8fecSSam Ravnborg stx %fsr, [%g2 + TI_XFSR] 128*478b8fecSSam Ravnborg sll %g1, 5, %g1 129*478b8fecSSam Ravnborg3: andcc %o5, FPRS_DL, %g0 130*478b8fecSSam Ravnborg be,pn %icc, 4f 131*478b8fecSSam Ravnborg add %g6, TI_FPREGS, %g2 132*478b8fecSSam Ravnborg 133*478b8fecSSam Ravnborg add %g6, TI_FPREGS+0x40, %g3 134*478b8fecSSam Ravnborg membar #Sync 135*478b8fecSSam Ravnborg stda %f0, [%g2 + %g1] ASI_BLK_P 136*478b8fecSSam Ravnborg stda %f16, [%g3 + %g1] ASI_BLK_P 137*478b8fecSSam Ravnborg membar #Sync 138*478b8fecSSam Ravnborg ba,pt %xcc, 4f 139*478b8fecSSam Ravnborg nop 140*478b8fecSSam Ravnborg 141*478b8fecSSam Ravnborg .align 32 142*478b8fecSSam Ravnborg4: and %o5, FPRS_DU, %o5 143*478b8fecSSam Ravnborg jmpl %g7 + %g0, %g0 144*478b8fecSSam Ravnborg wr %o5, FPRS_FEF, %fprs 145