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 9478b8fecSSam Ravnborg#include <asm/asi.h> 10478b8fecSSam Ravnborg#include <asm/page.h> 11478b8fecSSam Ravnborg#include <asm/ptrace.h> 12478b8fecSSam Ravnborg#include <asm/visasm.h> 13478b8fecSSam Ravnborg#include <asm/thread_info.h> 14478b8fecSSam Ravnborg 15478b8fecSSam Ravnborg .text 16478b8fecSSam Ravnborg .globl VISenter, VISenterhalf 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 */ 24478b8fecSSam Ravnborg 25478b8fecSSam Ravnborg .align 32 26478b8fecSSam RavnborgVISenter: 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 47*44922150SDavid 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 82