|  | #pragma once | 
|  | #include <compartment-macros.h> | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | /** | 
|  | * The kind of value, for values that have special-cased handling. | 
|  | */ | 
|  | enum DebugFormatArgumentKind : ptraddr_t | 
|  | { | 
|  | /// Boolean, printed as "true" or "false". | 
|  | DebugFormatArgumentBool, | 
|  | /// Single character. | 
|  | DebugFormatArgumentCharacter, | 
|  | /// Signed 32-bit integer, printed as decimal. | 
|  | DebugFormatArgumentSignedNumber32, | 
|  | /// Unsigned 32-bit integer, printed as hexadecimal | 
|  | DebugFormatArgumentUnsignedNumber32, | 
|  | /// Signed 64-bit integer, printed as decimal. | 
|  | DebugFormatArgumentSignedNumber64, | 
|  | /// Unsigned 64-bit integer, printed as hexadecimal. | 
|  | DebugFormatArgumentUnsignedNumber64, | 
|  | /// Pointer, printed as a full capability. | 
|  | DebugFormatArgumentPointer, | 
|  | /// Special case for permission sets, printed as in the capability | 
|  | /// format. | 
|  | DebugFormatArgumentPermissionSet, | 
|  | /// C string, printed as-is. | 
|  | DebugFormatArgumentCString, | 
|  | /// String view, printed as-is. | 
|  | DebugFormatArgumentStringView, | 
|  | }; | 
|  |  | 
|  | struct DebugFormatArgument | 
|  | { | 
|  | /** | 
|  | * The value that is being written. | 
|  | */ | 
|  | uintptr_t value; | 
|  | /** | 
|  | * The kind of value that is being written.  This is either a pointer | 
|  | * to a `DebugCallback` or one of the `Kind` enumeration, depending on | 
|  | * whether the tag is set or not. | 
|  | */ | 
|  | uintptr_t kind; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Library function that writes a debug message.  This runs with interrupts | 
|  | * disabled (to avoid interleaving) and prints an array of debug messages. This | 
|  | * is intended to allow a single call to print multiple format strings without | 
|  | * requiring the format strings to be copied, so that the debugging APIs can | 
|  | * wrap a user-provided format string. | 
|  | */ | 
|  | __cheri_libcall void | 
|  | debug_log_message_write(const char                 *context, | 
|  | const char                 *format, | 
|  | struct DebugFormatArgument *messages, | 
|  | size_t                      messageCount); | 
|  |  | 
|  | /** | 
|  | * Helper to write a debug message reporting an assertion or invariant failure. | 
|  | * This should be used only with the helper macros / templates in `debug.h[h]`. | 
|  | * This takes the kind of failure (for example, assert or invariant), the file, | 
|  | * function, and line number where the failure occurred, a format string, and | 
|  | * an array of arguments to the format string. | 
|  | */ | 
|  | __cheri_libcall void debug_report_failure(const char                 *kind, | 
|  | const char                 *file, | 
|  | const char                 *function, | 
|  | int                         line, | 
|  | const char                 *fmt, | 
|  | struct DebugFormatArgument *arguments, | 
|  | size_t argumentCount); |