| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/developer/debug/debug_agent/arch.h" |
| |
| #include <zircon/features.h> |
| #include <zircon/status.h> |
| #include <zircon/syscalls.h> |
| |
| #include "src/developer/debug/shared/logging/logging.h" |
| |
| namespace debug_agent { |
| namespace arch { |
| |
| uint32_t GetHardwareBreakpointCount() { |
| constexpr uint32_t kUninitialized = static_cast<uint32_t>(-1); |
| static uint32_t hw_breakpoint_count = kUninitialized; |
| |
| if (hw_breakpoint_count == kUninitialized) { |
| if (zx_status_t status = |
| zx_system_get_features(ZX_FEATURE_KIND_HW_BREAKPOINT_COUNT, &hw_breakpoint_count); |
| status == ZX_OK) { |
| DEBUG_LOG(Agent) << "Got HW breakpoint count: " << hw_breakpoint_count; |
| } else { |
| LOGS(Warn) << "Could not get HW breakpoint count: " << zx_status_get_string(status); |
| hw_breakpoint_count = 0; |
| } |
| } |
| return hw_breakpoint_count; |
| } |
| |
| uint32_t GetHardwareWatchpointCount() { |
| constexpr uint32_t kUninitialized = static_cast<uint32_t>(-1); |
| static uint32_t hw_watchpoint_count = kUninitialized; |
| |
| if (hw_watchpoint_count == kUninitialized) { |
| if (zx_status_t status = |
| zx_system_get_features(ZX_FEATURE_KIND_HW_WATCHPOINT_COUNT, &hw_watchpoint_count); |
| status == ZX_OK) { |
| DEBUG_LOG(Agent) << "Got HW watchpoint count: " << hw_watchpoint_count; |
| } else { |
| LOGS(Warn) << "Could not get HW watchpoint count: " << zx_status_get_string(status); |
| hw_watchpoint_count = 0; |
| } |
| } |
| return hw_watchpoint_count; |
| } |
| |
| } // namespace arch |
| } // namespace debug_agent |