Hello,
Thanks for the improved version!
Luca Dariz, le mer. 21 août 2024 18:36:14 +0200, a ecrit:
@@ -495,10 +534,11 @@ ASSERT_IPL(SPL0);
* concurrent fpu_set_state or fpu_get_state.
*/
kern_return_t
-fpu_get_state(const thread_t thread,
- struct i386_float_state *state)
+fpu_get_state(const thread_t thread, void *state, int flavor)
{
pcb_t pcb = thread->pcb;
+ struct i386_float_state *fstate = (struct i386_float_state*)state;
+ struct i386_xfloat_state *xfstate = (struct i386_xfloat_state*)state;
struct i386_fpsave_state *ifps;
ASSERT_IPL(SPL0);
@@ -512,7 +552,10 @@ ASSERT_IPL(SPL0);
* No valid floating-point state.
*/
simple_unlock(&pcb->lock);
- memset(state, 0, sizeof(struct i386_float_state));
+ if (flavor == i386_FLOAT_STATE)
+ memset(state, 0, sizeof(struct i386_float_state));
+ else if (flavor == i386_XFLOAT_STATE)
+ memset(state, 0, sizeof(struct i386_xfloat_state));
I guess we should also memset to 0 the fp_xsave_size - sizeof(struct
i386_xfp_save) part, to avoid leaking data? Thus just pass fp_xsave_size
rather than sizeof(struct i386_xfloat_state).
diff --git a/i386/include/mach/i386/thread_status.h
b/i386/include/mach/i386/thread_status.h
index 94596a74..e5632ed6 100644
--- a/i386/include/mach/i386/thread_status.h
+++ b/i386/include/mach/i386/thread_status.h
@@ -148,6 +149,20 @@ struct i386_float_state {
};
#define i386_FLOAT_STATE_COUNT (sizeof(struct
i386_float_state)/sizeof(unsigned int))
+#define XFP_STATE_BYTES (sizeof (struct i386_xfp_save))
+
+struct i386_xfloat_state {
+ int fpkind; /* FP_NO..FP_387X (readonly) */
+ int initialized;
+ int exc_status; /* exception status (readonly)
*/
+ int fp_save_kind; /* format of hardware state */
+ unsigned char hw_state[XFP_STATE_BYTES]; /* actual "hardware" state */
I'm wondering if it's really useful to use XFP_STATE_BYTES here, since
callers are supposed to be able to support the extended part. Better
make hw_state zero-sized so that any miss in supporting the extended
part will hopefully be much more probably caught. That'll also make
i386_get_xstate_size simpler.