mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2026-05-23 14:21:32 +01:00
718e1d194f
Add support for saving and restoring RISC-V floating-point (F/D) extension state in OpenSBI. This introduces a floating-point context structure and helper routines to perform full context save and restore. The floating-point context includes storage for all 32 FPi registers (f0–f31) along with the fcsr control and status register. The register state is saved and restored using double-precision load/store instructions (fsd/fld), and single-precision load/store instructions (fsw/flw) on an RV64 system with F and D-extension support. The implementation follows an eager context switching model where the entire FP state is saved and restored on every context switch. This avoids the need for trap-based lazy management and keeps the design simple and deterministic. Signed-off-by: Dave Patel <dave.patel@riscstar.com> Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260518083023.997323-3-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
36 lines
680 B
C
36 lines
680 B
C
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2026 RISCstar Solutions.
|
|
*
|
|
* Authors:
|
|
* Dave Patel <dave.patel@riscstar.com>
|
|
*/
|
|
#ifndef __SBI_FP_H__
|
|
#define __SBI_FP_H__
|
|
|
|
#include <sbi/sbi_types.h>
|
|
|
|
struct sbi_fp_context {
|
|
#if __riscv_d
|
|
uint64_t f[32];
|
|
#else
|
|
uint32_t f[32];
|
|
#endif
|
|
unsigned long fcsr;
|
|
};
|
|
|
|
#if defined(__riscv_f) || defined(__riscv_d)
|
|
void sbi_fp_save(struct sbi_fp_context *dst);
|
|
void sbi_fp_restore(const struct sbi_fp_context *src);
|
|
#else
|
|
static inline void sbi_fp_save(struct sbi_fp_context *dst)
|
|
{
|
|
}
|
|
static inline void sbi_fp_restore(const struct sbi_fp_context *src)
|
|
{
|
|
}
|
|
#endif /* __riscv_f || __riscv_d */
|
|
|
|
#endif /*__SBI_FP_H__ */
|