blob: 637e16629bb9c3d55f803c9e85137b2bed630c36 [file] [log] [blame]
#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);