mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-21 12:25:27 +00:00
expo: Add better error reporting
When building an expo fails, show some information about which node caused the problem. Use -ENOENT consistently when the ID is missing. This makes it easier for the user to debug things. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
37db20d0a6
commit
5fb9e2aab5
1 changed files with 45 additions and 12 deletions
|
@ -23,10 +23,14 @@
|
||||||
* if there is nothing for this ID. Since ID 0 is never used, the first
|
* if there is nothing for this ID. Since ID 0 is never used, the first
|
||||||
* element of this array is always NULL
|
* element of this array is always NULL
|
||||||
* @str_count: Number of entries in @str_for_id
|
* @str_count: Number of entries in @str_for_id
|
||||||
|
* @err_node: Node being processed (for error reporting)
|
||||||
|
* @err_prop: Property being processed (for error reporting)
|
||||||
*/
|
*/
|
||||||
struct build_info {
|
struct build_info {
|
||||||
const char **str_for_id;
|
const char **str_for_id;
|
||||||
int str_count;
|
int str_count;
|
||||||
|
ofnode err_node;
|
||||||
|
const char *err_prop;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -46,6 +50,7 @@ int add_txt_str(struct build_info *info, ofnode node, struct scene *scn,
|
||||||
uint str_id;
|
uint str_id;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
info->err_prop = find_name;
|
||||||
text = ofnode_read_string(node, find_name);
|
text = ofnode_read_string(node, find_name);
|
||||||
if (!text) {
|
if (!text) {
|
||||||
char name[40];
|
char name[40];
|
||||||
|
@ -54,7 +59,7 @@ int add_txt_str(struct build_info *info, ofnode node, struct scene *scn,
|
||||||
snprintf(name, sizeof(name), "%s-id", find_name);
|
snprintf(name, sizeof(name), "%s-id", find_name);
|
||||||
ret = ofnode_read_u32(node, name, &id);
|
ret = ofnode_read_u32(node, name, &id);
|
||||||
if (ret)
|
if (ret)
|
||||||
return log_msg_ret("id", -EINVAL);
|
return log_msg_ret("id", -ENOENT);
|
||||||
|
|
||||||
if (id >= info->str_count)
|
if (id >= info->str_count)
|
||||||
return log_msg_ret("id", -E2BIG);
|
return log_msg_ret("id", -E2BIG);
|
||||||
|
@ -164,9 +169,10 @@ static int read_strings(struct build_info *info, ofnode root)
|
||||||
int ret;
|
int ret;
|
||||||
u32 id;
|
u32 id;
|
||||||
|
|
||||||
|
info->err_node = node;
|
||||||
ret = ofnode_read_u32(node, "id", &id);
|
ret = ofnode_read_u32(node, "id", &id);
|
||||||
if (ret)
|
if (ret)
|
||||||
return log_msg_ret("id", -EINVAL);
|
return log_msg_ret("id", -ENOENT);
|
||||||
val = ofnode_read_string(node, "value");
|
val = ofnode_read_string(node, "value");
|
||||||
if (!val)
|
if (!val)
|
||||||
return log_msg_ret("val", -EINVAL);
|
return log_msg_ret("val", -EINVAL);
|
||||||
|
@ -241,6 +247,8 @@ static int menu_build(struct build_info *info, ofnode node, struct scene *scn,
|
||||||
return log_msg_ret("tit", ret);
|
return log_msg_ret("tit", ret);
|
||||||
title_id = ret;
|
title_id = ret;
|
||||||
ret = scene_menu_set_title(scn, menu_id, title_id);
|
ret = scene_menu_set_title(scn, menu_id, title_id);
|
||||||
|
if (ret)
|
||||||
|
return log_msg_ret("set", ret);
|
||||||
|
|
||||||
item_ids = ofnode_read_prop(node, "item-id", &size);
|
item_ids = ofnode_read_prop(node, "item-id", &size);
|
||||||
if (!item_ids)
|
if (!item_ids)
|
||||||
|
@ -300,7 +308,7 @@ static int obj_build(struct build_info *info, ofnode node, struct scene *scn)
|
||||||
log_debug("- object %s\n", ofnode_get_name(node));
|
log_debug("- object %s\n", ofnode_get_name(node));
|
||||||
ret = ofnode_read_u32(node, "id", &id);
|
ret = ofnode_read_u32(node, "id", &id);
|
||||||
if (ret)
|
if (ret)
|
||||||
return log_msg_ret("id", -EINVAL);
|
return log_msg_ret("id", -ENOENT);
|
||||||
|
|
||||||
type = ofnode_read_string(node, "type");
|
type = ofnode_read_string(node, "type");
|
||||||
if (!type)
|
if (!type)
|
||||||
|
@ -309,7 +317,7 @@ static int obj_build(struct build_info *info, ofnode node, struct scene *scn)
|
||||||
if (!strcmp("menu", type))
|
if (!strcmp("menu", type))
|
||||||
ret = menu_build(info, node, scn, id, &obj);
|
ret = menu_build(info, node, scn, id, &obj);
|
||||||
else
|
else
|
||||||
ret = -EINVAL;
|
ret = -EOPNOTSUPP;
|
||||||
if (ret)
|
if (ret)
|
||||||
return log_msg_ret("bld", ret);
|
return log_msg_ret("bld", ret);
|
||||||
|
|
||||||
|
@ -341,11 +349,12 @@ static int scene_build(struct build_info *info, ofnode scn_node,
|
||||||
ofnode node;
|
ofnode node;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
info->err_node = scn_node;
|
||||||
name = ofnode_get_name(scn_node);
|
name = ofnode_get_name(scn_node);
|
||||||
log_debug("Building scene %s\n", name);
|
log_debug("Building scene %s\n", name);
|
||||||
ret = ofnode_read_u32(scn_node, "id", &id);
|
ret = ofnode_read_u32(scn_node, "id", &id);
|
||||||
if (ret)
|
if (ret)
|
||||||
return log_msg_ret("id", -EINVAL);
|
return log_msg_ret("id", -ENOENT);
|
||||||
|
|
||||||
ret = scene_new(exp, name, id, &scn);
|
ret = scene_new(exp, name, id, &scn);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -362,6 +371,7 @@ static int scene_build(struct build_info *info, ofnode scn_node,
|
||||||
return log_msg_ret("pr", ret);
|
return log_msg_ret("pr", ret);
|
||||||
|
|
||||||
ofnode_for_each_subnode(node, scn_node) {
|
ofnode_for_each_subnode(node, scn_node) {
|
||||||
|
info->err_node = node;
|
||||||
ret = obj_build(info, node, scn);
|
ret = obj_build(info, node, scn);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return log_msg_ret("mit", ret);
|
return log_msg_ret("mit", ret);
|
||||||
|
@ -370,20 +380,19 @@ static int scene_build(struct build_info *info, ofnode scn_node,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int expo_build(ofnode root, struct expo **expp)
|
int build_it(struct build_info *info, ofnode root, struct expo **expp)
|
||||||
{
|
{
|
||||||
struct build_info info;
|
|
||||||
ofnode scenes, node;
|
ofnode scenes, node;
|
||||||
struct expo *exp;
|
struct expo *exp;
|
||||||
u32 dyn_start;
|
u32 dyn_start;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
memset(&info, '\0', sizeof(info));
|
ret = read_strings(info, root);
|
||||||
ret = read_strings(&info, root);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return log_msg_ret("str", ret);
|
return log_msg_ret("str", ret);
|
||||||
if (_DEBUG)
|
if (_DEBUG)
|
||||||
list_strings(&info);
|
list_strings(info);
|
||||||
|
info->err_node = root;
|
||||||
|
|
||||||
ret = expo_new("name", NULL, &exp);
|
ret = expo_new("name", NULL, &exp);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -397,7 +406,7 @@ int expo_build(ofnode root, struct expo **expp)
|
||||||
return log_msg_ret("sno", -EINVAL);
|
return log_msg_ret("sno", -EINVAL);
|
||||||
|
|
||||||
ofnode_for_each_subnode(node, scenes) {
|
ofnode_for_each_subnode(node, scenes) {
|
||||||
ret = scene_build(&info, node, exp);
|
ret = scene_build(info, node, exp);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return log_msg_ret("scn", ret);
|
return log_msg_ret("scn", ret);
|
||||||
}
|
}
|
||||||
|
@ -405,3 +414,27 @@ int expo_build(ofnode root, struct expo **expp)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int expo_build(ofnode root, struct expo **expp)
|
||||||
|
{
|
||||||
|
struct build_info info;
|
||||||
|
struct expo *exp;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memset(&info, '\0', sizeof(info));
|
||||||
|
ret = build_it(&info, root, &exp);
|
||||||
|
if (ret) {
|
||||||
|
char buf[120];
|
||||||
|
int node_ret;
|
||||||
|
|
||||||
|
node_ret = ofnode_get_path(info.err_node, buf, sizeof(buf));
|
||||||
|
log_warning("Build failed at node %s, property %s\n",
|
||||||
|
node_ret ? ofnode_get_name(info.err_node) : buf,
|
||||||
|
info.err_prop);
|
||||||
|
|
||||||
|
return log_msg_ret("bui", ret);
|
||||||
|
}
|
||||||
|
*expp = exp;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue