@@ -432,6 +432,7 @@ <h1>Source code for libdebug.architectures.amd64.amd64_ptrace_register_holder</h
432432
433433< span class ="kn "> from</ span > < span class ="nn "> __future__</ span > < span class ="kn "> import</ span > < span class ="n "> annotations</ span >
434434
435+ < span class ="kn "> from</ span > < span class ="nn "> ctypes</ span > < span class ="kn "> import</ span > < span class ="n "> c_longdouble</ span >
435436< span class ="kn "> from</ span > < span class ="nn "> dataclasses</ span > < span class ="kn "> import</ span > < span class ="n "> dataclass</ span >
436437< span class ="kn "> from</ span > < span class ="nn "> typing</ span > < span class ="kn "> import</ span > < span class ="n "> TYPE_CHECKING</ span >
437438
@@ -654,6 +655,36 @@ <h1>Source code for libdebug.architectures.amd64.amd64_ptrace_register_holder</h
654655
655656 < 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 >
656657
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 >
657688
658689< div class ="viewcode-block " id ="Amd64PtraceRegisterHolder ">
659690< 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
720751
721752 < span class ="c1 "> # setup floating-point registers</ span >
722753 < 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+
723756 < 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 >
724757 < span class ="k "> case</ span > < span class ="mi "> 0</ span > < span class ="p "> :</ span >
725758 < 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
757790 < 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 >
758791
759792
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+
760803 < 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 >
761804< 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 >
762805 < 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