• Paul Mackerras's avatar
    Add core logging · 49a4d9f6
    Paul Mackerras authored
    
    
    This logs 256 bits of data per cycle to a ring buffer in BRAM.  The
    data collected can be read out through 2 new SPRs or through the
    debug interface.
    
    The new SPRs are LOG_ADDR (724) and LOG_DATA (725).  LOG_ADDR contains
    the buffer write pointer in the upper 32 bits (in units of entries,
    i.e. 32 bytes) and the read pointer in the lower 32 bits (in units of
    doublewords, i.e. 8 bytes).  Reading LOG_DATA gives the doubleword
    from the buffer at the read pointer and increments the read pointer.
    Setting bit 31 of LOG_ADDR inhibits the trace log system from writing
    to the log buffer, so the contents are stable and can be read.
    
    There are two new debug addresses which function similarly to the
    LOG_ADDR and LOG_DATA SPRs.  The log is frozen while either or both of
    the LOG_ADDR SPR bit 31 or the debug LOG_ADDR register bit 31 are set.
    
    The buffer defaults to 2048 entries, i.e. 64kB.  The size is set by
    the LOG_LENGTH generic on the core_debug module.  Software can
    determine the length of the buffer because the length is ORed into the
    buffer write pointer in the upper 32 bits of LOG_ADDR.  Hence the
    length of the buffer can be calculated as 1 << (31 - clz(LOG_ADDR)).
    
    There is a program to format the log entries in a somewhat readable
    fashion in scripts/fmt_log/fmt_log.c.  The log_entry struct in that
    file describes the layout of the bits in the log entries.
    Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
    49a4d9f6
cr_file.vhdl 2.72 KB