5#include "sw/device/lib/base/status.h"
12const uint32_t MODULE_ID = 0;
14static const char *basename(
const char *file,
size_t *basename_len) {
21 while (f > file && f[-1] !=
'/' && f[-1] !=
'\\') {
28status_t status_from_rom_error(uint32_t val) {
30 val == kErrorOk ? 0 : bitfield_field32_read(val, ROM_ERROR_FIELD_STATUS);
31 int32_t arg = (int32_t)bitfield_field32_read(val, ROM_ERROR_FIELD_ERROR);
32 uint32_t mod = bitfield_field32_read(val, ROM_ERROR_FIELD_MODULE);
33 uint32_t module = (mod & 0x1F) << 16 | (mod & 0x1F00) << (21 - 8);
36 return status_create((absl_status_t)code, module,
"unk",
37 code == kOk ? kErrorOk : arg);
40status_t status_create(absl_status_t code, uint32_t module_id,
const char *file,
44 return (status_t){.value = arg};
65 size_t basename_len = 0;
66 const char *f = basename(file, &basename_len);
67 module_id = basename_len >= 3 ? MAKE_MODULE_ID(f[0], f[1], f[2])
68 : MAKE_MODULE_ID(
'u',
'n',
'd');
72 module_id = status_encode_module_id(module_id);
75 .value = (int32_t)(bitfield_field32_write(0, STATUS_FIELD_MODULE_ID,
77 bitfield_bit32_write(0, STATUS_BIT_ERROR,
true) |
78 bitfield_field32_write(0, STATUS_FIELD_CODE, code) |
79 bitfield_field32_write(0, STATUS_FIELD_ARG,
83const char *status_codes[] = {
122bool status_extract(status_t s,
const char **code, int32_t *arg,
char *mod_id) {
123 size_t err = (size_t)status_err(s);
124 if (s.value < 0 && err == 0) {
125 err =
sizeof(status_codes) /
sizeof(status_codes[0]) - 1;
127 *code = status_codes[err];
129 *arg = (int32_t)bitfield_field32_read((uint32_t)s.value, STATUS_FIELD_ARG);
131 bitfield_field32_read((uint32_t)s.value, STATUS_FIELD_MODULE_ID);
132 *mod_id++ =
'@' + ((module_id >> 0) & 0x1F);
133 *mod_id++ =
'@' + ((module_id >> 5) & 0x1F);
134 *mod_id++ =
'@' + ((module_id >> 10) & 0x1F);
142extern bool status_ok(status_t s);
143extern absl_status_t status_err(status_t s);
149void status_report(status_t value) { (void)value; }