@@ -696,6 +696,124 @@ impl VMProcessor {
696
696
Ok ( ( ) )
697
697
}
698
698
699
+ pub ( super ) fn get_fpu ( & self ) -> Result < WHvFPURegisters > {
700
+ use windows:: Win32 :: System :: Hypervisor :: * ;
701
+
702
+ const LEN : usize = 26 ;
703
+ let names: [ WHV_REGISTER_NAME ; LEN ] = [
704
+ WHvX64RegisterXmm0 ,
705
+ WHvX64RegisterXmm1 ,
706
+ WHvX64RegisterXmm2 ,
707
+ WHvX64RegisterXmm3 ,
708
+ WHvX64RegisterXmm4 ,
709
+ WHvX64RegisterXmm5 ,
710
+ WHvX64RegisterXmm6 ,
711
+ WHvX64RegisterXmm7 ,
712
+ WHvX64RegisterXmm8 ,
713
+ WHvX64RegisterXmm9 ,
714
+ WHvX64RegisterXmm10 ,
715
+ WHvX64RegisterXmm11 ,
716
+ WHvX64RegisterXmm12 ,
717
+ WHvX64RegisterXmm13 ,
718
+ WHvX64RegisterXmm14 ,
719
+ WHvX64RegisterXmm15 ,
720
+ WHvX64RegisterFpMmx0 ,
721
+ WHvX64RegisterFpMmx1 ,
722
+ WHvX64RegisterFpMmx2 ,
723
+ WHvX64RegisterFpMmx3 ,
724
+ WHvX64RegisterFpMmx4 ,
725
+ WHvX64RegisterFpMmx5 ,
726
+ WHvX64RegisterFpMmx6 ,
727
+ WHvX64RegisterFpMmx7 ,
728
+ WHvX64RegisterFpControlStatus ,
729
+ WHvX64RegisterXmmControlStatus ,
730
+ ] ;
731
+
732
+ let mut out: [ WHV_REGISTER_VALUE ; LEN ] = unsafe { std:: mem:: zeroed ( ) } ;
733
+ unsafe {
734
+ WHvGetVirtualProcessorRegisters (
735
+ self . get_partition_hdl ( ) ,
736
+ 0 ,
737
+ names. as_ptr ( ) ,
738
+ LEN as u32 ,
739
+ out. as_mut_ptr ( ) ,
740
+ ) ?;
741
+ }
742
+
743
+ // Helper to read a WHV_UINT128 -> u128
744
+ fn u128_from_whv ( fp : WHV_REGISTER_VALUE ) -> u128 {
745
+ unsafe {
746
+ let low = fp. Fp . AsUINT128 . Anonymous . Low64 as u128 ;
747
+ let high = fp. Fp . AsUINT128 . Anonymous . High64 as u128 ;
748
+ ( high << 64 ) | low
749
+ }
750
+ }
751
+
752
+ let xmm = [
753
+ u128_from_whv ( out[ 0 ] ) ,
754
+ u128_from_whv ( out[ 1 ] ) ,
755
+ u128_from_whv ( out[ 2 ] ) ,
756
+ u128_from_whv ( out[ 3 ] ) ,
757
+ u128_from_whv ( out[ 4 ] ) ,
758
+ u128_from_whv ( out[ 5 ] ) ,
759
+ u128_from_whv ( out[ 6 ] ) ,
760
+ u128_from_whv ( out[ 7 ] ) ,
761
+ u128_from_whv ( out[ 8 ] ) ,
762
+ u128_from_whv ( out[ 9 ] ) ,
763
+ u128_from_whv ( out[ 10 ] ) ,
764
+ u128_from_whv ( out[ 11 ] ) ,
765
+ u128_from_whv ( out[ 12 ] ) ,
766
+ u128_from_whv ( out[ 13 ] ) ,
767
+ u128_from_whv ( out[ 14 ] ) ,
768
+ u128_from_whv ( out[ 15 ] ) ,
769
+ ] ;
770
+
771
+ let mmx = [
772
+ out[ 16 ] . Reg64 ,
773
+ out[ 17 ] . Reg64 ,
774
+ out[ 18 ] . Reg64 ,
775
+ out[ 19 ] . Reg64 ,
776
+ out[ 20 ] . Reg64 ,
777
+ out[ 21 ] . Reg64 ,
778
+ out[ 22 ] . Reg64 ,
779
+ out[ 23 ] . Reg64 ,
780
+ ] ;
781
+
782
+ let fp_control_word = unsafe { out[ 24 ] . FpControlStatus . Anonymous . FpControl } ;
783
+ let fp_tag_word = unsafe { out[ 24 ] . FpControlStatus . Anonymous . FpTag } ;
784
+ let mxcsr = unsafe { out[ 25 ] . XmmControlStatus . Anonymous . XmmStatusControl } ;
785
+
786
+ Ok ( WHvFPURegisters {
787
+ xmm0 : xmm[ 0 ] ,
788
+ xmm1 : xmm[ 1 ] ,
789
+ xmm2 : xmm[ 2 ] ,
790
+ xmm3 : xmm[ 3 ] ,
791
+ xmm4 : xmm[ 4 ] ,
792
+ xmm5 : xmm[ 5 ] ,
793
+ xmm6 : xmm[ 6 ] ,
794
+ xmm7 : xmm[ 7 ] ,
795
+ xmm8 : xmm[ 8 ] ,
796
+ xmm9 : xmm[ 9 ] ,
797
+ xmm10 : xmm[ 10 ] ,
798
+ xmm11 : xmm[ 11 ] ,
799
+ xmm12 : xmm[ 12 ] ,
800
+ xmm13 : xmm[ 13 ] ,
801
+ xmm14 : xmm[ 14 ] ,
802
+ xmm15 : xmm[ 15 ] ,
803
+ mmx0 : mmx[ 0 ] ,
804
+ mmx1 : mmx[ 1 ] ,
805
+ mmx2 : mmx[ 2 ] ,
806
+ mmx3 : mmx[ 3 ] ,
807
+ mmx4 : mmx[ 4 ] ,
808
+ mmx5 : mmx[ 5 ] ,
809
+ mmx6 : mmx[ 6 ] ,
810
+ mmx7 : mmx[ 7 ] ,
811
+ fp_control_word,
812
+ fp_tag_word,
813
+ mxcsr,
814
+ } )
815
+ }
816
+
699
817
#[ instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level= "Trace" ) ]
700
818
pub ( super ) fn run ( & mut self ) -> Result < WHV_RUN_VP_EXIT_CONTEXT > {
701
819
let partition_handle = self . get_partition_hdl ( ) ;
0 commit comments