| // Copyright 2021 The Fuchsia Authors |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #ifndef ZIRCON_KERNEL_INCLUDE_PLATFORM_RAM_MAPPABLE_CRASHLOG_H_ |
| #define ZIRCON_KERNEL_INCLUDE_PLATFORM_RAM_MAPPABLE_CRASHLOG_H_ |
| |
| #include <kernel/lockdep.h> |
| #include <kernel/spinlock.h> |
| #include <kernel/timer.h> |
| #include <ktl/atomic.h> |
| #include <ktl/span.h> |
| #include <platform/crashlog.h> |
| #include <ram-crashlog/ram-crashlog.h> |
| |
| class RamMappableCrashlog final : public PlatformCrashlog::Interface { |
| public: |
| RamMappableCrashlog() = delete; |
| RamMappableCrashlog(paddr_t phys, size_t len); |
| |
| ktl::span<char> GetRenderTarget() final { return render_target_; } |
| |
| void Finalize(zircon_crash_reason_t reason, size_t amt) final; |
| size_t Recover(FILE* tgt) final; |
| void EnableCrashlogUptimeUpdates(bool enabled) final; |
| |
| private: |
| bool ShouldPrintCrashlogStatus() { |
| bool expected = false; |
| return status_printed_to_debuglog_.compare_exchange_strong(expected, true, |
| ktl::memory_order_relaxed); |
| } |
| |
| void UpdateUptimeLocked() TA_REQ(uptime_updater_lock_); |
| |
| const ktl::span<char> crashlog_buffer_; |
| const ktl::span<char> render_target_; |
| |
| recovered_ram_crashlog_t recovered_log_; |
| zx_status_t log_recovery_result_ = ZX_ERR_INTERNAL; |
| |
| DECLARE_SPINLOCK(RamMappableCrashlog) uptime_updater_lock_; |
| Timer uptime_updater_timer_ TA_GUARDED(uptime_updater_lock_); |
| bool uptime_updater_enabled_ TA_GUARDED(uptime_updater_lock_) = false; |
| |
| // Make sure we print the crashlog status to the debuglog only once, no matter |
| // how many times recover_crashlog is called. |
| ktl::atomic<bool> status_printed_to_debuglog_{false}; |
| }; |
| |
| #endif // ZIRCON_KERNEL_INCLUDE_PLATFORM_RAM_MAPPABLE_CRASHLOG_H_ |