| 212 | } |
| 213 | |
| 214 | int fmap_find_region_name(const struct region * const ar, |
| 215 | char name[FMAP_STRLEN]) |
| 216 | { |
| 217 | struct region_device fmrd; |
| 218 | size_t offset; |
| 219 | |
| 220 | if (name == NULL || ar == NULL) |
| 221 | return -1; |
| 222 | |
| 223 | if (find_fmap_directory(&fmrd)) |
| 224 | return -1; |
| 225 | |
| 226 | /* Start reading the areas just after fmap header. */ |
| 227 | offset = sizeof(struct fmap); |
| 228 | |
| 229 | while (1) { |
| 230 | struct fmap_area *area; |
| 231 | |
| 232 | area = rdev_mmap(&fmrd, offset, sizeof(*area)); |
| 233 | |
| 234 | if (area == NULL) |
| 235 | return -1; |
| 236 | |
| 237 | if (region_offset(ar) != le32toh(area->offset) || |
| 238 | region_sz(ar) != le32toh(area->size)) { |
| 239 | rdev_munmap(&fmrd, area); |
| 240 | offset += sizeof(struct fmap_area); |
| 241 | continue; |
| 242 | } |
| 243 | |
| 244 | printk(BIOS_DEBUG, "FMAP: area (%zx, %zx) found, named %s\n", |
| 245 | region_offset(ar), region_sz(ar), area->name); |
| 246 | |
| 247 | memcpy(name, area->name, FMAP_STRLEN); |
| 248 | |
| 249 | rdev_munmap(&fmrd, area); |
| 250 | |
| 251 | return 0; |
| 252 | } |
| 253 | |
| 254 | printk(BIOS_DEBUG, "FMAP: area (%zx, %zx) not found\n", |
| 255 | region_offset(ar), region_sz(ar)); |
| 256 | |
| 257 | return -1; |
| 258 | } |
| 259 | |
| 260 | ssize_t fmap_read_area(const char *name, void *buffer, size_t size) |
| 261 | { |