@@ -54,6 +54,9 @@ struct RegData {
5454
5555 RegData (int offset = -1 , int size = 0 )
5656 : offset(offset), size(size), xsave_feature_bit(-1 ) {}
57+ size_t end () const {
58+ return offset + size;
59+ }
5760};
5861
5962static bool reg_in_range (GdbServerRegister regno, GdbServerRegister low, GdbServerRegister high,
@@ -259,7 +262,7 @@ static uint64_t* xsave_features(vector<uint8_t>& data) {
259262
260263size_t ExtraRegisters::read_register (uint8_t * buf, GdbServerRegister regno,
261264 bool * defined ) const {
262- if (format_ == NT_FPR ) {
265+ if (format_ == AARCH64_FPR ) {
263266 if (arch () != aarch64) {
264267 *defined = false ;
265268 return 0 ;
@@ -290,12 +293,19 @@ size_t ExtraRegisters::read_register(uint8_t* buf, GdbServerRegister regno,
290293 memcpy (buf, &mask, sizeof (mask));
291294 return sizeof (mask);
292295#endif
296+ } else if (regno == DREG_TPIDR ) {
297+ reg_data = RegData (sizeof (ARM64Arch::user_fpsimd_state),
298+ sizeof (uint64_t ));
299+ if (reg_data.end () > data_.size ()) {
300+ *defined = false ;
301+ return 0 ;
302+ }
293303 } else {
294304 *defined = false ;
295305 return 0 ;
296306 }
297307
298- DEBUG_ASSERT (size_t ( reg_data.offset + reg_data. size ) <= data_.size ());
308+ DEBUG_ASSERT (reg_data.end ( ) <= data_.size ());
299309 *defined = true ;
300310 memcpy (buf, data_.data () + reg_data.offset , reg_data.size );
301311 return reg_data.size ;
@@ -332,7 +342,7 @@ size_t ExtraRegisters::read_register(uint8_t* buf, GdbServerRegister regno,
332342
333343bool ExtraRegisters::write_register (GdbServerRegister regno, const void * value,
334344 size_t value_size) {
335- if (format_ == NT_FPR ) {
345+ if (format_ == AARCH64_FPR ) {
336346 if (arch () != aarch64) {
337347 return false ;
338348 }
@@ -538,7 +548,7 @@ void ExtraRegisters::print_register_file_compact(FILE* f) const {
538548 print_regs (*this , DREG_64_XMM0 , DREG_64_YMM0H , 16 , " ymm" , f);
539549 break ;
540550 case aarch64:
541- DEBUG_ASSERT (format_ == NT_FPR );
551+ DEBUG_ASSERT (format_ == AARCH64_FPR );
542552 print_regs (*this , DREG_V0 , GdbServerRegister (0 ), 32 , " v" , f);
543553 fputc (' ' , f);
544554 print_reg (*this , DREG_FPSR , GdbServerRegister (0 ), " fpsr" , f);
@@ -629,11 +639,11 @@ bool ExtraRegisters::set_to_raw_data(SupportedArch a, Format format,
629639
630640 if (format == NONE ) {
631641 return true ;
632- } else if (format == NT_FPR ) {
642+ } else if (format == AARCH64_FPR ) {
633643 if (!memcpy_fpr_regs_arch (a, data_, data, data_size)) {
634644 return false ;
635645 }
636- format_ = NT_FPR ;
646+ format_ = AARCH64_FPR ;
637647 return true ;
638648 }
639649
@@ -788,7 +798,7 @@ vector<uint8_t> ExtraRegisters::get_user_fpregs_struct(
788798 return to_vector (
789799 *reinterpret_cast <const X64Arch::user_fpregs_struct*>(data_.data ()));
790800 case aarch64:
791- DEBUG_ASSERT (format_ == NT_FPR );
801+ DEBUG_ASSERT (format_ == AARCH64_FPR );
792802 DEBUG_ASSERT (data_.size () == sizeof (ARM64Arch::user_fpregs_struct));
793803 return to_vector (
794804 *reinterpret_cast <const ARM64Arch::user_fpregs_struct*>(data_.data ()));
@@ -816,7 +826,7 @@ void ExtraRegisters::set_user_fpregs_struct(Task* t, SupportedArch arch,
816826 memcpy (data_.data (), data, sizeof (X64Arch::user_fpregs_struct));
817827 return ;
818828 case aarch64:
819- DEBUG_ASSERT (format_ == NT_FPR );
829+ DEBUG_ASSERT (format_ == AARCH64_FPR );
820830 ASSERT (t, size >= sizeof (ARM64Arch::user_fpregs_struct));
821831 ASSERT (t, data_.size () >= sizeof (ARM64Arch::user_fpregs_struct));
822832 memcpy (data_.data (), data, sizeof (ARM64Arch::user_fpregs_struct));
@@ -890,7 +900,7 @@ void ExtraRegisters::reset() {
890900 memcpy (data_.data () + xinuse_offset, &xinuse, sizeof (xinuse));
891901 }
892902 } else {
893- DEBUG_ASSERT (format_ == NT_FPR );
903+ DEBUG_ASSERT (format_ == AARCH64_FPR );
894904 DEBUG_ASSERT (arch () == aarch64 &&
895905 " Ensure that nothing is required here for your architecture." );
896906 }
@@ -953,7 +963,7 @@ void ExtraRegisters::compare_internal(const ExtraRegisters& reg2,
953963 compare_regs (*this , reg2, DREG_64_XMM0 , avx_present ? DREG_64_YMM0H : NOT_PRESENT , 8 , " ymm" , result);
954964 break ;
955965 case aarch64:
956- DEBUG_ASSERT (format_ == NT_FPR );
966+ DEBUG_ASSERT (format_ == AARCH64_FPR );
957967 compare_regs (*this , reg2, DREG_V0 , NOT_PRESENT , 32 , " v" , result);
958968 break ;
959969 default :
0 commit comments