mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
caab277b1d
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license version 2 as published by the free software foundation this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details you should have received a copy of the gnu general public license along with this program if not see http www gnu org licenses extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 503 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Alexios Zavras <alexios.zavras@intel.com> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Enrico Weigelt <info@metux.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190602204653.811534538@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
58 lines
1.4 KiB
ArmAsm
58 lines
1.4 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2012 - Virtual Open Systems and Columbia University
|
|
* Author: Christoffer Dall <c.dall@virtualopensystems.com>
|
|
*/
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm/vfpmacros.h>
|
|
|
|
.text
|
|
.pushsection .hyp.text, "ax"
|
|
|
|
/* void __vfp_save_state(struct vfp_hard_struct *vfp); */
|
|
ENTRY(__vfp_save_state)
|
|
push {r4, r5}
|
|
VFPFMRX r1, FPEXC
|
|
|
|
@ Make sure *really* VFP is enabled so we can touch the registers.
|
|
orr r5, r1, #FPEXC_EN
|
|
tst r5, #FPEXC_EX @ Check for VFP Subarchitecture
|
|
bic r5, r5, #FPEXC_EX @ FPEXC_EX disable
|
|
VFPFMXR FPEXC, r5
|
|
isb
|
|
|
|
VFPFMRX r2, FPSCR
|
|
beq 1f
|
|
|
|
@ If FPEXC_EX is 0, then FPINST/FPINST2 reads are upredictable, so
|
|
@ we only need to save them if FPEXC_EX is set.
|
|
VFPFMRX r3, FPINST
|
|
tst r5, #FPEXC_FP2V
|
|
VFPFMRX r4, FPINST2, ne @ vmrsne
|
|
1:
|
|
VFPFSTMIA r0, r5 @ Save VFP registers
|
|
stm r0, {r1-r4} @ Save FPEXC, FPSCR, FPINST, FPINST2
|
|
pop {r4, r5}
|
|
bx lr
|
|
ENDPROC(__vfp_save_state)
|
|
|
|
/* void __vfp_restore_state(struct vfp_hard_struct *vfp);
|
|
* Assume FPEXC_EN is on and FPEXC_EX is off */
|
|
ENTRY(__vfp_restore_state)
|
|
VFPFLDMIA r0, r1 @ Load VFP registers
|
|
ldm r0, {r0-r3} @ Load FPEXC, FPSCR, FPINST, FPINST2
|
|
|
|
VFPFMXR FPSCR, r1
|
|
tst r0, #FPEXC_EX @ Check for VFP Subarchitecture
|
|
beq 1f
|
|
VFPFMXR FPINST, r2
|
|
tst r0, #FPEXC_FP2V
|
|
VFPFMXR FPINST2, r3, ne
|
|
1:
|
|
VFPFMXR FPEXC, r0 @ FPEXC (last, in case !EN)
|
|
bx lr
|
|
ENDPROC(__vfp_restore_state)
|
|
|
|
.popsection
|