| 158 | } |
| 159 | |
| 160 | int fmap_print(const struct fmap *fmap) |
| 161 | { |
| 162 | int i; |
| 163 | struct kv_pair *kv = NULL; |
| 164 | const uint8_t *tmp; |
| 165 | |
| 166 | kv = kv_pair_new(); |
| 167 | if (!kv) |
| 168 | return -1; |
| 169 | |
| 170 | tmp = fmap->signature; |
| 171 | kv_pair_fmt(kv, "fmap_signature", |
| 172 | "0x%02x%02x%02x%02x%02x%02x%02x%02x", |
| 173 | tmp[0], tmp[1], tmp[2], tmp[3], |
| 174 | tmp[4], tmp[5], tmp[6], tmp[7]); |
| 175 | kv_pair_fmt(kv, "fmap_ver_major", "%d", fmap->ver_major); |
| 176 | kv_pair_fmt(kv, "fmap_ver_minor","%d", fmap->ver_minor); |
| 177 | kv_pair_fmt(kv, "fmap_base", "0x%016llx", |
| 178 | (unsigned long long)le64toh(fmap->base)); |
| 179 | kv_pair_fmt(kv, "fmap_size", "0x%04x", le32toh(fmap->size)); |
| 180 | kv_pair_fmt(kv, "fmap_name", "%s", fmap->name); |
| 181 | kv_pair_fmt(kv, "fmap_nareas", "%d", le16toh(fmap->nareas)); |
| 182 | kv_pair_print(kv); |
| 183 | kv_pair_free(kv); |
| 184 | |
| 185 | for (i = 0; i < le16toh(fmap->nareas); i++) { |
| 186 | struct kv_pair *pair; |
| 187 | uint16_t flags; |
| 188 | char *str; |
| 189 | |
| 190 | pair = kv_pair_new(); |
| 191 | if (!pair) |
| 192 | return -1; |
| 193 | |
| 194 | kv_pair_fmt(pair, "area_offset", "0x%08x", |
| 195 | le32toh(fmap->areas[i].offset)); |
| 196 | kv_pair_fmt(pair, "area_size", "0x%08x", |
| 197 | le32toh(fmap->areas[i].size)); |
| 198 | kv_pair_fmt(pair, "area_name", "%s", |
| 199 | fmap->areas[i].name); |
| 200 | kv_pair_fmt(pair, "area_flags_raw", "0x%02x", |
| 201 | le16toh(fmap->areas[i].flags)); |
| 202 | |
| 203 | /* Print descriptive strings for flags rather than the field */ |
| 204 | flags = le16toh(fmap->areas[i].flags); |
| 205 | str = fmap_flags_to_string(flags); |
| 206 | if (str == NULL) { |
| 207 | kv_pair_free(pair); |
| 208 | return -1; |
| 209 | } |
| 210 | kv_pair_fmt(pair, "area_flags", "%s", str); |
| 211 | free(str); |
| 212 | |
| 213 | kv_pair_print(pair); |
| 214 | kv_pair_free(pair); |
| 215 | } |
| 216 | |
| 217 | return 0; |