|  | // 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 |