5#ifndef OPENTITAN_SW_DEVICE_LIB_BASE_STATUS_H_
6#define OPENTITAN_SW_DEVICE_LIB_BASE_STATUS_H_
16#include "sw/device/silicon_creator/lib/error.h"
18#define USING_INTERNAL_STATUS
19#include "sw/device/lib/base/internal/status.h"
20#undef USING_INTERNAL_STATUS
63#define RECORD_STATUS_CREATE(code, mod_id, file) \
64 _RECORD_STATUS_CREATE(code, mod_id, file)
73} ot_status_create_record_t;
75enum ot_status_create_record_magic {
76 OT_SCR_UNKNOWN_MOD_ID = 0xffffffff,
84#define _RECORD_STATUS_CREATE(...)
86#define _RECORD_STATUS_CREATE(code_val, mod_id, file) \
90 __builtin_choose_expr(code_val != kOk, \
91 __RECORD_STATUS_CREATE(code_val, mod_id, file), ({}))
93#define __RECORD_STATUS_CREATE(code_val, mod_id, file) \
95 OT_SECTION(".ot.status_create_record") \
97 static const ot_status_create_record_t kOtStatusRecord = { \
100 .module_id = __builtin_constant_p(mod_id) ? mod_id : OT_SCR_UNKNOWN_MOD_ID, \
106#define _DIF_RESULT_INTO_STATUS(val_) \
108 absl_status_t code_; \
109 memcpy(&code_, &val_, sizeof(code_)); \
110 status_create(code_, MODULE_ID, __FILE__, code_ == kOk ? 0 : __LINE__); \
113#define _ROM_ERROR_INTO_STATUS(val_) \
116 memcpy(&val32_, &val_, sizeof(val32_)); \
117 status_from_rom_error(val32_); \
130#define INTO_STATUS(expr_) \
132 __auto_type val_ = (expr_); \
135 rom_error_t: _ROM_ERROR_INTO_STATUS(val_), \
136 dif_result_t: _DIF_RESULT_INTO_STATUS(val_)); \
147void status_report(status_t value);
156#define STATUS_REPORT_HERE(status) \
158 absl_status_t err = status_err(status); \
159 status_t report = status_create(err, MODULE_ID, __FILE__, __LINE__); \
160 status_report(report); \
176 status_t status_ = INTO_STATUS(expr_); \
177 if (status_.value < 0) { \
178 STATUS_REPORT_HERE(status_); \
188extern const uint32_t MODULE_ID;
201status_t status_create(absl_status_t code, uint32_t mod_id,
const char *file,
211status_t status_from_rom_error(uint32_t val);
224bool status_extract(status_t s,
const char **code, int32_t *arg,
char *mod_id);
243 return s.value < 0 ? (absl_status_t)bitfield_field32_read(
251#define STATUS_CREATE(s_, ...) \
253 static_assert(OT_VA_ARGS_COUNT(_, __VA_ARGS__) <= 2, \
254 "status macros take 0 or 1 arguments"); \
255 RECORD_STATUS_CREATE(s_, MODULE_ID, __FILE__); \
256 status_create(s_, MODULE_ID, __FILE__, OT_GET_LAST_ARG(__VA_ARGS__)); \
261#define OK_STATUS(...) STATUS_CREATE(kOk, 0, ##__VA_ARGS__)
262#define CANCELLED(...) STATUS_CREATE(kCancelled, __LINE__, ##__VA_ARGS__)
263#define UNKNOWN(...) STATUS_CREATE(kUnknown, __LINE__, ##__VA_ARGS__)
264#define INVALID_ARGUMENT(...) STATUS_CREATE(kInvalidArgument, __LINE__, ##__VA_ARGS__)
265#define DEADLINE_EXCEEDED(...) STATUS_CREATE(kDeadlineExceeded, __LINE__, ##__VA_ARGS__)
266#define NOT_FOUND(...) STATUS_CREATE(kNotFound, __LINE__, ##__VA_ARGS__)
267#define ALREADY_EXISTS(...) STATUS_CREATE(kAlreadyExists, __LINE__, ##__VA_ARGS__)
268#define PERMISSION_DENIED(...) STATUS_CREATE(kPermissionDenied, __LINE__, ##__VA_ARGS__)
269#define RESOURCE_EXHAUSTED(...) STATUS_CREATE(kResourceExhausted, __LINE__, ##__VA_ARGS__)
270#define FAILED_PRECONDITION(...) STATUS_CREATE(kFailedPrecondition, __LINE__, ##__VA_ARGS__)
271#define ABORTED(...) STATUS_CREATE(kAborted, __LINE__, ##__VA_ARGS__)
272#define OUT_OF_RANGE(...) STATUS_CREATE(kOutOfRange, __LINE__, ##__VA_ARGS__)
273#define UNIMPLEMENTED(...) STATUS_CREATE(kUnimplemented, __LINE__, ##__VA_ARGS__)
274#define INTERNAL(...) STATUS_CREATE(kInternal, __LINE__, ##__VA_ARGS__)
275#define UNAVAILABLE(...) STATUS_CREATE(kUnavailable, __LINE__, ##__VA_ARGS__)
276#define DATA_LOSS(...) STATUS_CREATE(kDataLoss, __LINE__, ##__VA_ARGS__)
277#define UNAUTHENTICATED(...) STATUS_CREATE(kUnauthenticated, __LINE__, ##__VA_ARGS__)