| // Copyright 2016 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 |
| |
| #pragma once |
| |
| #include <zircon/compiler.h> |
| #include <zircon/types.h> |
| #include <kernel/event.h> |
| #include <kernel/mutex.h> |
| #include <list.h> |
| #include <stdint.h> |
| |
| __BEGIN_CDECLS |
| |
| typedef struct dlog dlog_t; |
| typedef struct dlog_header dlog_header_t; |
| typedef struct dlog_record dlog_record_t; |
| typedef struct dlog_reader dlog_reader_t; |
| |
| struct dlog { |
| spin_lock_t lock; |
| |
| size_t head; |
| size_t tail; |
| |
| void* data; |
| |
| bool panic; |
| |
| event_t event; |
| |
| mutex_t readers_lock; |
| struct list_node readers; |
| }; |
| |
| struct dlog_reader { |
| struct list_node node; |
| |
| dlog_t* log; |
| size_t tail; |
| |
| void (*notify)(void* cookie); |
| void *cookie; |
| }; |
| |
| #define DLOG_HDR_SET(fifosize, readsize) \ |
| ((((readsize) & 0xFFF) << 12) | ((fifosize) & 0xFFF)) |
| |
| #define DLOG_HDR_GET_FIFOLEN(n) ((n) & 0xFFF) |
| #define DLOG_HDR_GET_READLEN(n) (((n) >> 12) & 0xFFF) |
| |
| #define DLOG_MIN_RECORD (32u) |
| #define DLOG_MAX_DATA (224u) |
| #define DLOG_MAX_RECORD (DLOG_MIN_RECORD + DLOG_MAX_DATA) |
| |
| struct dlog_header { |
| uint32_t header; |
| uint16_t datalen; |
| uint16_t flags; |
| uint64_t timestamp; |
| uint64_t pid; |
| uint64_t tid; |
| }; |
| |
| struct dlog_record { |
| dlog_header_t hdr; |
| char data[DLOG_MAX_DATA]; |
| }; |
| |
| static_assert(sizeof(dlog_header_t) == DLOG_MIN_RECORD, ""); |
| static_assert(sizeof(dlog_record_t) == DLOG_MAX_RECORD, ""); |
| |
| void dlog_reader_init(dlog_reader_t* rdr, void (*notify)(void*), void* cookie); |
| void dlog_reader_destroy(dlog_reader_t* rdr); |
| zx_status_t dlog_write(uint32_t flags, const void* ptr, size_t len); |
| zx_status_t dlog_read(dlog_reader_t* rdr, uint32_t flags, void* ptr, size_t len, size_t* actual); |
| |
| // bluescreen_init should be called at the "start" of a fatal fault or |
| // panic to ensure that the fault output (via kernel printf/dprintf) |
| // is captured or displayed to the user |
| void dlog_bluescreen_init(void); |
| |
| // bluescreen_halt should be called from inside platform_halt to allow |
| // the bluescreen service to finalize the display of the panic data |
| // (for example, creating a qrcode) |
| void dlog_bluescreen_halt(void); |
| |
| __END_CDECLS |