| //===-- 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::WatchpointDetails> | |
| 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); | |
| } |