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(expr_) \
108 typeof(expr_) _val = (expr_); \
109 absl_status_t code; \
110 memcpy(&code, &_val, sizeof(code)); \
111 status_create(code, MODULE_ID, __FILE__, code == kOk ? 0 : __LINE__); \
114#define ROM_ERROR_INTO_STATUS(expr_) \
116 typeof(expr_) ex_ = (expr_); \
118 memcpy(&val, &ex_, sizeof(val)); \
119 absl_status_t code = \
120 val == kErrorOk ? 0 \
121 : bitfield_field32_read(val, ROM_ERROR_FIELD_STATUS); \
122 int32_t arg = (int32_t)bitfield_field32_read(val, ROM_ERROR_FIELD_ERROR); \
123 uint32_t mod = bitfield_field32_read(val, ROM_ERROR_FIELD_MODULE); \
124 uint32_t module = (mod & 0x1F) << 16 | (mod & 0x1F00) << (21 - 8); \
125 status_create(code, module, __FILE__, code == kOk ? kErrorOk : arg); \
139 #define INTO_STATUS(expr_) _Generic((expr_), \
141 rom_error_t: ROM_ERROR_INTO_STATUS(expr_), \
142 dif_result_t: DIF_RESULT_INTO_STATUS(expr_))
153void status_report(status_t value);
162#define STATUS_REPORT_HERE(status) \
164 absl_status_t err = status_err(status); \
165 status_t report = status_create(err, MODULE_ID, __FILE__, __LINE__); \
166 status_report(report); \
182 status_t status_ = INTO_STATUS(expr_); \
183 if (status_.value < 0) { \
184 STATUS_REPORT_HERE(status_); \
194extern const uint32_t MODULE_ID;
207status_t status_create(absl_status_t code, uint32_t mod_id,
const char *file,
221bool status_extract(status_t s,
const char **code, int32_t *arg,
char *mod_id);
240 return s.value < 0 ? (absl_status_t)bitfield_field32_read(
248#define STATUS_CREATE(s_, ...) \
250 static_assert(OT_VA_ARGS_COUNT(_, __VA_ARGS__) <= 2, \
251 "status macros take 0 or 1 arguments"); \
252 RECORD_STATUS_CREATE(s_, MODULE_ID, __FILE__); \
253 status_create(s_, MODULE_ID, __FILE__, OT_GET_LAST_ARG(__VA_ARGS__)); \
258#define OK_STATUS(...) STATUS_CREATE(kOk, 0, ##__VA_ARGS__)
259#define CANCELLED(...) STATUS_CREATE(kCancelled, __LINE__, ##__VA_ARGS__)
260#define UNKNOWN(...) STATUS_CREATE(kUnknown, __LINE__, ##__VA_ARGS__)
261#define INVALID_ARGUMENT(...) STATUS_CREATE(kInvalidArgument, __LINE__, ##__VA_ARGS__)
262#define DEADLINE_EXCEEDED(...) STATUS_CREATE(kDeadlineExceeded, __LINE__, ##__VA_ARGS__)
263#define NOT_FOUND(...) STATUS_CREATE(kNotFound, __LINE__, ##__VA_ARGS__)
264#define ALREADY_EXISTS(...) STATUS_CREATE(kAlreadyExists, __LINE__, ##__VA_ARGS__)
265#define PERMISSION_DENIED(...) STATUS_CREATE(kPermissionDenied, __LINE__, ##__VA_ARGS__)
266#define RESOURCE_EXHAUSTED(...) STATUS_CREATE(kResourceExhausted, __LINE__, ##__VA_ARGS__)
267#define FAILED_PRECONDITION(...) STATUS_CREATE(kFailedPrecondition, __LINE__, ##__VA_ARGS__)
268#define ABORTED(...) STATUS_CREATE(kAborted, __LINE__, ##__VA_ARGS__)
269#define OUT_OF_RANGE(...) STATUS_CREATE(kOutOfRange, __LINE__, ##__VA_ARGS__)
270#define UNIMPLEMENTED(...) STATUS_CREATE(kUnimplemented, __LINE__, ##__VA_ARGS__)
271#define INTERNAL(...) STATUS_CREATE(kInternal, __LINE__, ##__VA_ARGS__)
272#define UNAVAILABLE(...) STATUS_CREATE(kUnavailable, __LINE__, ##__VA_ARGS__)
273#define DATA_LOSS(...) STATUS_CREATE(kDataLoss, __LINE__, ##__VA_ARGS__)
274#define UNAUTHENTICATED(...) STATUS_CREATE(kUnauthenticated, __LINE__, ##__VA_ARGS__)