@@ -432,6 +432,7 @@ <h1>Source code for libdebug.architectures.amd64.amd64_ptrace_register_holder</h
432
432
433
433
< span class ="kn "> from</ span > < span class ="nn "> __future__</ span > < span class ="kn "> import</ span > < span class ="n "> annotations</ span >
434
434
435
+ < span class ="kn "> from</ span > < span class ="nn "> ctypes</ span > < span class ="kn "> import</ span > < span class ="n "> c_longdouble</ span >
435
436
< span class ="kn "> from</ span > < span class ="nn "> dataclasses</ span > < span class ="kn "> import</ span > < span class ="n "> dataclass</ span >
436
437
< span class ="kn "> from</ span > < span class ="nn "> typing</ span > < span class ="kn "> import</ span > < span class ="n "> TYPE_CHECKING</ span >
437
438
@@ -654,6 +655,36 @@ <h1>Source code for libdebug.architectures.amd64.amd64_ptrace_register_holder</h
654
655
655
656
< span class ="k "> return</ span > < span class ="nb "> property</ span > < span class ="p "> (</ span > < span class ="n "> getter</ span > < span class ="p "> ,</ span > < span class ="n "> setter</ span > < span class ="p "> ,</ span > < span class ="kc "> None</ span > < span class ="p "> ,</ span > < span class ="n "> name</ span > < span class ="p "> )</ span >
656
657
658
+ < span class ="k "> def</ span > < span class ="nf "> _get_property_fp_mmx</ span > < span class ="p "> (</ span > < span class ="n "> name</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="p "> ,</ span > < span class ="n "> index</ span > < span class ="p "> :</ span > < span class ="nb "> int</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="nb "> property</ span > < span class ="p "> :</ span >
659
+ < span class ="k "> def</ span > < span class ="nf "> getter</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> :</ span > < span class ="n "> Amd64Registers</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="nb "> int</ span > < span class ="p "> :</ span >
660
+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> fresh</ span > < span class ="p "> :</ span >
661
+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _internal_debugger</ span > < span class ="o "> .</ span > < span class ="n "> _fetch_fp_registers</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> )</ span >
662
+ < span class ="k "> return</ span > < span class ="nb "> int</ span > < span class ="o "> .</ span > < span class ="n "> from_bytes</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> mmx</ span > < span class ="p "> [</ span > < span class ="n "> index</ span > < span class ="p "> ]</ span > < span class ="o "> .</ span > < span class ="n "> data</ span > < span class ="p "> ,</ span > < span class ="s2 "> "little"</ span > < span class ="p "> )</ span > < span class ="o "> &</ span > < span class ="p "> ((</ span > < span class ="mi "> 1</ span > < span class ="o "> <<</ span > < span class ="mi "> 64</ span > < span class ="p "> )</ span > < span class ="o "> -</ span > < span class ="mi "> 1</ span > < span class ="p "> )</ span >
663
+
664
+ < span class ="k "> def</ span > < span class ="nf "> setter</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> :</ span > < span class ="n "> Amd64Registers</ span > < span class ="p "> ,</ span > < span class ="n "> value</ span > < span class ="p "> :</ span > < span class ="nb "> int</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="kc "> None</ span > < span class ="p "> :</ span >
665
+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> fresh</ span > < span class ="p "> :</ span >
666
+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _internal_debugger</ span > < span class ="o "> .</ span > < span class ="n "> _fetch_fp_registers</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> )</ span >
667
+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> mmx</ span > < span class ="p "> [</ span > < span class ="n "> index</ span > < span class ="p "> ]</ span > < span class ="o "> .</ span > < span class ="n "> data</ span > < span class ="o "> =</ span > < span class ="p "> (</ span > < span class ="n "> value</ span > < span class ="o "> &</ span > < span class ="p "> ((</ span > < span class ="mi "> 1</ span > < span class ="o "> <<</ span > < span class ="mi "> 64</ span > < span class ="p "> )</ span > < span class ="o "> -</ span > < span class ="mi "> 1</ span > < span class ="p "> ))</ span > < span class ="o "> .</ span > < span class ="n "> to_bytes</ span > < span class ="p "> (</ span > < span class ="mi "> 16</ span > < span class ="p "> ,</ span > < span class ="s2 "> "little"</ span > < span class ="p "> )</ span >
668
+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> dirty</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span >
669
+
670
+ < span class ="k "> return</ span > < span class ="nb "> property</ span > < span class ="p "> (</ span > < span class ="n "> getter</ span > < span class ="p "> ,</ span > < span class ="n "> setter</ span > < span class ="p "> ,</ span > < span class ="kc "> None</ span > < span class ="p "> ,</ span > < span class ="n "> name</ span > < span class ="p "> )</ span >
671
+
672
+ < span class ="k "> def</ span > < span class ="nf "> _get_property_fp_st</ span > < span class ="p "> (</ span > < span class ="n "> name</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="p "> ,</ span > < span class ="n "> index</ span > < span class ="p "> :</ span > < span class ="nb "> int</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="nb "> property</ span > < span class ="p "> :</ span >
673
+ < span class ="c1 "> # We should be able to expose the long double member from CFFI directly</ span >
674
+ < span class ="c1 "> # But their support for long double does not actually allow for value comparison or manipulation</ span >
675
+ < span class ="c1 "> # So, ctypes it is</ span >
676
+ < span class ="k "> def</ span > < span class ="nf "> getter</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> :</ span > < span class ="n "> Amd64Registers</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="nb "> float</ span > < span class ="p "> :</ span >
677
+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> fresh</ span > < span class ="p "> :</ span >
678
+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _internal_debugger</ span > < span class ="o "> .</ span > < span class ="n "> _fetch_fp_registers</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> )</ span >
679
+ < span class ="k "> return</ span > < span class ="n "> c_longdouble</ span > < span class ="o "> .</ span > < span class ="n "> from_buffer_copy</ span > < span class ="p "> (</ span > < span class ="nb "> bytes</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> mmx</ span > < span class ="p "> [</ span > < span class ="n "> index</ span > < span class ="p "> ]</ span > < span class ="o "> .</ span > < span class ="n "> data</ span > < span class ="p "> ))</ span > < span class ="o "> .</ span > < span class ="n "> value</ span >
680
+
681
+ < span class ="k "> def</ span > < span class ="nf "> setter</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> :</ span > < span class ="n "> Amd64Registers</ span > < span class ="p "> ,</ span > < span class ="n "> value</ span > < span class ="p "> :</ span > < span class ="nb "> float</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="kc "> None</ span > < span class ="p "> :</ span >
682
+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> fresh</ span > < span class ="p "> :</ span >
683
+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _internal_debugger</ span > < span class ="o "> .</ span > < span class ="n "> _fetch_fp_registers</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> )</ span >
684
+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> mmx</ span > < span class ="p "> [</ span > < span class ="n "> index</ span > < span class ="p "> ]</ span > < span class ="o "> .</ span > < span class ="n "> data</ span > < span class ="o "> =</ span > < span class ="nb "> bytes</ span > < span class ="p "> (</ span > < span class ="n "> c_longdouble</ span > < span class ="p "> (</ span > < span class ="n "> value</ span > < span class ="p "> ))</ span >
685
+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> dirty</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span >
686
+
687
+ < span class ="k "> return</ span > < span class ="nb "> property</ span > < span class ="p "> (</ span > < span class ="n "> getter</ span > < span class ="p "> ,</ span > < span class ="n "> setter</ span > < span class ="p "> ,</ span > < span class ="kc "> None</ span > < span class ="p "> ,</ span > < span class ="n "> name</ span > < span class ="p "> )</ span >
657
688
658
689
< div class ="viewcode-block " id ="Amd64PtraceRegisterHolder ">
659
690
< a class ="viewcode-back " href ="../../../../libdebug.architectures.amd64.html#libdebug.architectures.amd64.amd64_ptrace_register_holder.Amd64PtraceRegisterHolder "> [docs]</ a >
@@ -720,6 +751,8 @@ <h1>Source code for libdebug.architectures.amd64.amd64_ptrace_register_holder</h
720
751
721
752
< span class ="c1 "> # setup floating-point registers</ span >
722
753
< span class ="c1 "> # see libdebug/cffi/ptrace_cffi_build.py for the possible values of fp_register_file.type</ span >
754
+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _handle_fp_legacy</ span > < span class ="p "> (</ span > < span class ="n "> target_class</ span > < span class ="p "> )</ span >
755
+
723
756
< span class ="k "> match</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> fp_register_file</ span > < span class ="o "> .</ span > < span class ="n "> type</ span > < span class ="p "> :</ span >
724
757
< span class ="k "> case</ span > < span class ="mi "> 0</ span > < span class ="p "> :</ span >
725
758
< span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _handle_fp_512</ span > < span class ="p "> (</ span > < span class ="n "> target_class</ span > < span class ="p "> )</ span >
@@ -757,6 +790,16 @@ <h1>Source code for libdebug.architectures.amd64.amd64_ptrace_register_holder</h
757
790
< span class ="n "> target_class</ span > < span class ="o "> .</ span > < span class ="n "> syscall_arg5</ span > < span class ="o "> =</ span > < span class ="n "> _get_property_64</ span > < span class ="p "> (</ span > < span class ="s2 "> "r9"</ span > < span class ="p "> )</ span > </ div >
758
791
759
792
793
+ < span class ="k "> def</ span > < span class ="nf "> _handle_fp_legacy</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> :</ span > < span class ="n "> Amd64PtraceRegisterHolder</ span > < span class ="p "> ,</ span > < span class ="n "> target_class</ span > < span class ="p "> :</ span > < span class ="nb "> type</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="kc "> None</ span > < span class ="p "> :</ span >
794
+ < span class ="w "> </ span > < span class ="sd "> """Handle legacy mmx and st registers."""</ span >
795
+ < span class ="k "> for</ span > < span class ="n "> index</ span > < span class ="ow "> in</ span > < span class ="nb "> range</ span > < span class ="p "> (</ span > < span class ="mi "> 8</ span > < span class ="p "> ):</ span >
796
+ < span class ="n "> name</ span > < span class ="o "> =</ span > < span class ="sa "> f</ span > < span class ="s2 "> "mm</ span > < span class ="si "> {</ span > < span class ="n "> index</ span > < span class ="si "> }</ span > < span class ="s2 "> "</ span >
797
+ < span class ="nb "> setattr</ span > < span class ="p "> (</ span > < span class ="n "> target_class</ span > < span class ="p "> ,</ span > < span class ="n "> name</ span > < span class ="p "> ,</ span > < span class ="n "> _get_property_fp_mmx</ span > < span class ="p "> (</ span > < span class ="n "> name</ span > < span class ="p "> ,</ span > < span class ="n "> index</ span > < span class ="p "> ))</ span >
798
+
799
+ < span class ="k "> for</ span > < span class ="n "> index</ span > < span class ="ow "> in</ span > < span class ="nb "> range</ span > < span class ="p "> (</ span > < span class ="mi "> 8</ span > < span class ="p "> ):</ span >
800
+ < span class ="n "> name</ span > < span class ="o "> =</ span > < span class ="sa "> f</ span > < span class ="s2 "> "st</ span > < span class ="si "> {</ span > < span class ="n "> index</ span > < span class ="si "> }</ span > < span class ="s2 "> "</ span >
801
+ < span class ="nb "> setattr</ span > < span class ="p "> (</ span > < span class ="n "> target_class</ span > < span class ="p "> ,</ span > < span class ="n "> name</ span > < span class ="p "> ,</ span > < span class ="n "> _get_property_fp_st</ span > < span class ="p "> (</ span > < span class ="n "> name</ span > < span class ="p "> ,</ span > < span class ="n "> index</ span > < span class ="p "> ))</ span >
802
+
760
803
< span class ="k "> def</ span > < span class ="nf "> _handle_fp_512</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> :</ span > < span class ="n "> Amd64PtraceRegisterHolder</ span > < span class ="p "> ,</ span > < span class ="n "> target_class</ span > < span class ="p "> :</ span > < span class ="nb "> type</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="kc "> None</ span > < span class ="p "> :</ span >
761
804
< span class ="w "> </ span > < span class ="sd "> """Handle the case where the xsave area is 512 bytes long, which means we just have the xmm registers."""</ span >
762
805
< span class ="k "> for</ span > < span class ="n "> index</ span > < span class ="ow "> in</ span > < span class ="nb "> range</ span > < span class ="p "> (</ span > < span class ="mi "> 16</ span > < span class ="p "> ):</ span >
0 commit comments