1478b8fecSSam Ravnborg/* 2478b8fecSSam Ravnborg * VISsave.S: Code for saving FPU register state for 3478b8fecSSam Ravnborg * VIS routines. One should not call this directly, 4478b8fecSSam Ravnborg * but use macros provided in <asm/visasm.h>. 5478b8fecSSam Ravnborg * 6478b8fecSSam Ravnborg * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) 7478b8fecSSam Ravnborg */ 8478b8fecSSam Ravnborg 973958c65SSam Ravnborg#include <linux/linkage.h> 1073958c65SSam Ravnborg 11478b8fecSSam Ravnborg#include <asm/asi.h> 12478b8fecSSam Ravnborg#include <asm/page.h> 13478b8fecSSam Ravnborg#include <asm/ptrace.h> 14478b8fecSSam Ravnborg#include <asm/visasm.h> 15478b8fecSSam Ravnborg#include <asm/thread_info.h> 16*d3867f04SAl Viro#include <asm/export.h> 17478b8fecSSam Ravnborg 18478b8fecSSam Ravnborg /* On entry: %o5=current FPRS value, %g7 is callers address */ 19478b8fecSSam Ravnborg /* May clobber %o5, %g1, %g2, %g3, %g7, %icc, %xcc */ 20478b8fecSSam Ravnborg 21478b8fecSSam Ravnborg /* Nothing special need be done here to handle pre-emption, this 22478b8fecSSam Ravnborg * FPU save/restore mechanism is already preemption safe. 23478b8fecSSam Ravnborg */ 2473958c65SSam Ravnborg .text 25478b8fecSSam Ravnborg .align 32 2673958c65SSam RavnborgENTRY(VISenter) 27478b8fecSSam Ravnborg ldub [%g6 + TI_FPDEPTH], %g1 28478b8fecSSam Ravnborg brnz,a,pn %g1, 1f 29478b8fecSSam Ravnborg cmp %g1, 1 30478b8fecSSam Ravnborg stb %g0, [%g6 + TI_FPSAVED] 31478b8fecSSam Ravnborg stx %fsr, [%g6 + TI_XFSR] 32478b8fecSSam Ravnborg9: jmpl %g7 + %g0, %g0 33478b8fecSSam Ravnborg nop 34478b8fecSSam Ravnborg1: bne,pn %icc, 2f 35478b8fecSSam Ravnborg 36478b8fecSSam Ravnborg srl %g1, 1, %g1 37478b8fecSSam Ravnborgvis1: ldub [%g6 + TI_FPSAVED], %g3 38478b8fecSSam Ravnborg stx %fsr, [%g6 + TI_XFSR] 39478b8fecSSam Ravnborg or %g3, %o5, %g3 40478b8fecSSam Ravnborg stb %g3, [%g6 + TI_FPSAVED] 41478b8fecSSam Ravnborg rd %gsr, %g3 42478b8fecSSam Ravnborg clr %g1 43478b8fecSSam Ravnborg ba,pt %xcc, 3f 44478b8fecSSam Ravnborg 45478b8fecSSam Ravnborg stx %g3, [%g6 + TI_GSR] 46478b8fecSSam Ravnborg2: add %g6, %g1, %g3 4744922150SDavid S. Miller mov FPRS_DU | FPRS_DL | FPRS_FEF, %o5 48478b8fecSSam Ravnborg sll %g1, 3, %g1 49478b8fecSSam Ravnborg stb %o5, [%g3 + TI_FPSAVED] 50478b8fecSSam Ravnborg rd %gsr, %g2 51478b8fecSSam Ravnborg add %g6, %g1, %g3 52478b8fecSSam Ravnborg stx %g2, [%g3 + TI_GSR] 53478b8fecSSam Ravnborg 54478b8fecSSam Ravnborg add %g6, %g1, %g2 55478b8fecSSam Ravnborg stx %fsr, [%g2 + TI_XFSR] 56478b8fecSSam Ravnborg sll %g1, 5, %g1 57478b8fecSSam Ravnborg3: andcc %o5, FPRS_DL|FPRS_DU, %g0 58478b8fecSSam Ravnborg be,pn %icc, 9b 59478b8fecSSam Ravnborg add %g6, TI_FPREGS, %g2 60478b8fecSSam Ravnborg andcc %o5, FPRS_DL, %g0 61478b8fecSSam Ravnborg 62478b8fecSSam Ravnborg be,pn %icc, 4f 63478b8fecSSam Ravnborg add %g6, TI_FPREGS+0x40, %g3 64478b8fecSSam Ravnborg membar #Sync 65478b8fecSSam Ravnborg stda %f0, [%g2 + %g1] ASI_BLK_P 66478b8fecSSam Ravnborg stda %f16, [%g3 + %g1] ASI_BLK_P 67478b8fecSSam Ravnborg membar #Sync 68478b8fecSSam Ravnborg andcc %o5, FPRS_DU, %g0 69478b8fecSSam Ravnborg be,pn %icc, 5f 70478b8fecSSam Ravnborg4: add %g1, 128, %g1 71478b8fecSSam Ravnborg membar #Sync 72478b8fecSSam Ravnborg stda %f32, [%g2 + %g1] ASI_BLK_P 73478b8fecSSam Ravnborg 74478b8fecSSam Ravnborg stda %f48, [%g3 + %g1] ASI_BLK_P 75478b8fecSSam Ravnborg5: membar #Sync 76478b8fecSSam Ravnborg ba,pt %xcc, 80f 77478b8fecSSam Ravnborg nop 78478b8fecSSam Ravnborg 79478b8fecSSam Ravnborg .align 32 80478b8fecSSam Ravnborg80: jmpl %g7 + %g0, %g0 81478b8fecSSam Ravnborg nop 8273958c65SSam RavnborgENDPROC(VISenter) 83*d3867f04SAl ViroEXPORT_SYMBOL(VISenter) 84