Linux x86 SIMD: Add XSAVEC support to kfpu_begin()

Since there is a register restore bug in XSAVES and XRSTORS add and
use XSAVEC if available.

Signed-off-by: Attila Fülöp <attila@fueloep.org>
This commit is contained in:
Attila Fülöp 2023-03-01 18:59:44 +01:00
parent 4fe9cc5437
commit 9e803591e3
2 changed files with 28 additions and 0 deletions

View File

@ -27,6 +27,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD], [
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEOPT
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEC
;;
esac
])
@ -488,3 +489,24 @@ AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES], [
AC_MSG_RESULT([no])
])
])
dnl #
dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEC
dnl #
AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEC], [
AC_MSG_CHECKING([whether host toolchain supports XSAVEC])
AC_LINK_IFELSE([AC_LANG_SOURCE([
[
void main()
{
char b[4096] __attribute__ ((aligned (64)));
__asm__ __volatile__("xsavec %[b]\n" : : [b] "m" (*b) : "memory");
}
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_XSAVEC], 1, [Define if host toolchain supports XSAVEC])
], [
AC_MSG_RESULT([no])
])
])

View File

@ -311,6 +311,12 @@ kfpu_begin(void)
* FPU state to be correctly preserved and restored.
*/
uint8_t *state = zfs_kfpu_fpregs[smp_processor_id()];
#if defined(HAVE_XSAVEC)
if (static_cpu_has(X86_FEATURE_XSAVEC)) {
kfpu_do_xsave("xsavec", state, ~0);
return;
}
#endif
#if defined(HAVE_XSAVES)
if (static_cpu_has(X86_FEATURE_XSAVES)) {
kfpu_do_xsave("xsaves", state, ~0);