mgorny created this revision. mgorny added reviewers: labath, krytarowski. mgorny requested review of this revision.
Ensure that xs_xstate_bv is set correctly before calling WriteRegisterSet(). The bit can be clear if the relevant registers were at their initial state when they were read, and it needs to be set in order to apply changes from the XState structure. https://reviews.llvm.org/D90105 Files: lldb/source/Plugins/Process/NetBSD/NativeRegisterContextNetBSD_x86_64.cpp Index: lldb/source/Plugins/Process/NetBSD/NativeRegisterContextNetBSD_x86_64.cpp =================================================================== --- lldb/source/Plugins/Process/NetBSD/NativeRegisterContextNetBSD_x86_64.cpp +++ lldb/source/Plugins/Process/NetBSD/NativeRegisterContextNetBSD_x86_64.cpp @@ -894,33 +894,43 @@ #endif case lldb_fctrl_x86_64: m_xstate.xs_fxsave.fx_cw = reg_value.GetAsUInt16(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_fstat_x86_64: m_xstate.xs_fxsave.fx_sw = reg_value.GetAsUInt16(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_ftag_x86_64: m_xstate.xs_fxsave.fx_tw = reg_value.GetAsUInt16(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_fop_x86_64: m_xstate.xs_fxsave.fx_opcode = reg_value.GetAsUInt16(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_fiseg_x86_64: m_xstate.xs_fxsave.fx_ip.fa_32.fa_seg = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_fioff_x86_64: m_xstate.xs_fxsave.fx_ip.fa_32.fa_off = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_foseg_x86_64: m_xstate.xs_fxsave.fx_dp.fa_32.fa_seg = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_fooff_x86_64: m_xstate.xs_fxsave.fx_dp.fa_32.fa_off = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_mxcsr_x86_64: m_xstate.xs_fxsave.fx_mxcsr = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_SSE; break; case lldb_mxcsrmask_x86_64: m_xstate.xs_fxsave.fx_mxcsr_mask = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_SSE; break; case lldb_st0_x86_64: case lldb_st1_x86_64: @@ -932,6 +942,7 @@ case lldb_st7_x86_64: ::memcpy(&m_xstate.xs_fxsave.fx_87_ac[reg - lldb_st0_x86_64], reg_value.GetBytes(), reg_value.GetByteSize()); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_mm0_x86_64: case lldb_mm1_x86_64: @@ -943,6 +954,7 @@ case lldb_mm7_x86_64: ::memcpy(&m_xstate.xs_fxsave.fx_87_ac[reg - lldb_mm0_x86_64], reg_value.GetBytes(), reg_value.GetByteSize()); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_xmm0_x86_64: case lldb_xmm1_x86_64: @@ -966,6 +978,7 @@ } else { ::memcpy(&m_xstate.xs_fxsave.fx_xmm[reg - lldb_xmm0_x86_64], reg_value.GetBytes(), reg_value.GetByteSize()); + m_xstate.xs_xstate_bv |= XCR0_SSE; } break; case lldb_ymm0_x86_64: @@ -994,6 +1007,7 @@ ::memcpy(ymm.bytes, reg_value.GetBytes(), reg_value.GetByteSize()); YMMToXState(ymm, m_xstate.xs_fxsave.fx_xmm[reg_index].xmm_bytes, m_xstate.xs_ymm_hi128.xs_ymm[reg_index].ymm_bytes); + m_xstate.xs_xstate_bv |= XCR0_SSE | XCR0_YMM_Hi128; } break; case lldb_dr0_x86_64:
Index: lldb/source/Plugins/Process/NetBSD/NativeRegisterContextNetBSD_x86_64.cpp =================================================================== --- lldb/source/Plugins/Process/NetBSD/NativeRegisterContextNetBSD_x86_64.cpp +++ lldb/source/Plugins/Process/NetBSD/NativeRegisterContextNetBSD_x86_64.cpp @@ -894,33 +894,43 @@ #endif case lldb_fctrl_x86_64: m_xstate.xs_fxsave.fx_cw = reg_value.GetAsUInt16(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_fstat_x86_64: m_xstate.xs_fxsave.fx_sw = reg_value.GetAsUInt16(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_ftag_x86_64: m_xstate.xs_fxsave.fx_tw = reg_value.GetAsUInt16(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_fop_x86_64: m_xstate.xs_fxsave.fx_opcode = reg_value.GetAsUInt16(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_fiseg_x86_64: m_xstate.xs_fxsave.fx_ip.fa_32.fa_seg = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_fioff_x86_64: m_xstate.xs_fxsave.fx_ip.fa_32.fa_off = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_foseg_x86_64: m_xstate.xs_fxsave.fx_dp.fa_32.fa_seg = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_fooff_x86_64: m_xstate.xs_fxsave.fx_dp.fa_32.fa_off = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_mxcsr_x86_64: m_xstate.xs_fxsave.fx_mxcsr = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_SSE; break; case lldb_mxcsrmask_x86_64: m_xstate.xs_fxsave.fx_mxcsr_mask = reg_value.GetAsUInt32(); + m_xstate.xs_xstate_bv |= XCR0_SSE; break; case lldb_st0_x86_64: case lldb_st1_x86_64: @@ -932,6 +942,7 @@ case lldb_st7_x86_64: ::memcpy(&m_xstate.xs_fxsave.fx_87_ac[reg - lldb_st0_x86_64], reg_value.GetBytes(), reg_value.GetByteSize()); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_mm0_x86_64: case lldb_mm1_x86_64: @@ -943,6 +954,7 @@ case lldb_mm7_x86_64: ::memcpy(&m_xstate.xs_fxsave.fx_87_ac[reg - lldb_mm0_x86_64], reg_value.GetBytes(), reg_value.GetByteSize()); + m_xstate.xs_xstate_bv |= XCR0_X87; break; case lldb_xmm0_x86_64: case lldb_xmm1_x86_64: @@ -966,6 +978,7 @@ } else { ::memcpy(&m_xstate.xs_fxsave.fx_xmm[reg - lldb_xmm0_x86_64], reg_value.GetBytes(), reg_value.GetByteSize()); + m_xstate.xs_xstate_bv |= XCR0_SSE; } break; case lldb_ymm0_x86_64: @@ -994,6 +1007,7 @@ ::memcpy(ymm.bytes, reg_value.GetBytes(), reg_value.GetByteSize()); YMMToXState(ymm, m_xstate.xs_fxsave.fx_xmm[reg_index].xmm_bytes, m_xstate.xs_ymm_hi128.xs_ymm[reg_index].ymm_bytes); + m_xstate.xs_xstate_bv |= XCR0_SSE | XCR0_YMM_Hi128; } break; case lldb_dr0_x86_64:
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits