diff --git a/cmd/qemu_fw_cfg.c b/cmd/qemu_fw_cfg.c index 48ae476..192b7d1 100644 --- a/cmd/qemu_fw_cfg.c +++ b/cmd/qemu_fw_cfg.c @@ -229,10 +229,27 @@ void qemu_fwcfg_free_files(void) } } +struct fw_file *qemu_fwcfg_file_iter_init(struct fw_cfg_file_iter *iter) +{ + iter->entry = fw_list.next; + return list_entry(iter->entry, struct fw_file, list); +} + +struct fw_file *qemu_fwcfg_file_iter_next(struct fw_cfg_file_iter *iter) +{ + iter->entry = iter->entry->next; + return list_entry(iter->entry, struct fw_file, list); +} + +bool qemu_fwcfg_file_iter_end(struct fw_cfg_file_iter *iter) +{ + return iter->entry == &fw_list; +} + static int qemu_fwcfg_list_firmware(void) { int ret; - struct list_head *entry; + struct fw_cfg_file_iter iter; struct fw_file *file; /* make sure fw_list is loaded */ @@ -240,8 +257,10 @@ static int qemu_fwcfg_list_firmware(void) if (ret) return ret; - list_for_each(entry, &fw_list) { - file = list_entry(entry, struct fw_file, list); + + for (file = qemu_fwcfg_file_iter_init(&iter); + !qemu_fwcfg_file_iter_end(&iter); + file = qemu_fwcfg_file_iter_next(&iter)) { printf("%-56s\n", file->cfg.name); } diff --git a/include/qemu_fw_cfg.h b/include/qemu_fw_cfg.h index e21f150..19d0ba0 100644 --- a/include/qemu_fw_cfg.h +++ b/include/qemu_fw_cfg.h @@ -87,6 +87,10 @@ struct fw_file { struct list_head list; /* list node to link to fw_list */ }; +struct fw_cfg_file_iter { + struct list_head *entry; /* structure to iterate file list */ +}; + struct fw_cfg_dma_access { __be32 control; __be32 length; @@ -159,4 +163,9 @@ void qemu_fwcfg_free_files(void); */ int qemu_fwcfg_online_cpus(void); +/* helper functions to iterate firmware file list */ +struct fw_file *qemu_fwcfg_file_iter_init(struct fw_cfg_file_iter *iter); +struct fw_file *qemu_fwcfg_file_iter_next(struct fw_cfg_file_iter *iter); +bool qemu_fwcfg_file_iter_end(struct fw_cfg_file_iter *iter); + #endif