//===-- NativeRegisterContextDBReg_loongarch.cpp --------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "NativeRegisterContextDBReg_loongarch.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/RegisterValue.h" using namespace lldb_private; uint32_t NativeRegisterContextDBReg_loongarch::GetWatchpointSize(uint32_t wp_index) { Log *log = GetLog(LLDBLog::Watchpoints); LLDB_LOG(log, "wp_index: {0}", wp_index); switch ((m_hwp_regs[wp_index].control >> 10) & 0x3) { case 0x0: return 8; case 0x1: return 4; case 0x2: return 2; case 0x3: return 1; default: return 0; } } std::optional NativeRegisterContextDBReg_loongarch::AdjustWatchpoint( const WatchpointDetails &details) { // LoongArch only needs to check the size; it does not need to check the // address. size_t size = details.size; if (size != 1 && size != 2 && size != 4 && size != 8) return std::nullopt; return details; } uint32_t NativeRegisterContextDBReg_loongarch::MakeBreakControlValue(size_t size) { // Return encoded hardware breakpoint control value. return m_hw_dbg_enable_bit; } uint32_t NativeRegisterContextDBReg_loongarch::MakeWatchControlValue( size_t size, uint32_t watch_flags) { // Encoding hardware watchpoint control value. // Size encoded: // case 1 : 0b11 // case 2 : 0b10 // case 4 : 0b01 // case 8 : 0b00 size_t encoded_size = (3 - llvm::Log2_32(size)) << 10; return m_hw_dbg_enable_bit | encoded_size | (watch_flags << 8); }